# Claves de campo

Los nombres estables que usan las automatizaciones para dirigirse a tus campos — de dónde vienen y cómo mantenerlos estables.

## Claves de campo

Una clave de campo es el nombre de cara al desarrollador de un campo en un formulario — company_name, contacts. Es cómo una automatización precompleta un campo, lo bloquea, o lee la respuesta después, y sobrevive a un cambio de título o a una duplicación.

<h2 id="why">Por qué existen</h2>

<p>
  Sin claves de campo, una automatización tendría que dirigirse a tus preguntas por ids internos que no significan nada para nadie — y un
  payload de webhook llegaría lleno de ellos. Con claves de campo, ambos lados leen lo mismo:
</p>

```
{ "company_name": "Acme", "employees": 120, "contacts": [{ "name": "Ada" }] }
```

<p>
  Las claves de campo se usan en dos sitios: <code>prefill</code>, <code>context</code> y <code>readonly</code> al crear una solicitud; y
  los mapas <code>answers</code> y <code>display</code> de cada callback y cada payload de webhook.
</p>

<h2 id="where">Dónde encontrarlas</h2>

<p>
  Cada clave que publica el formulario vive en un solo lugar, la tabla de <strong>Claves</strong>: cada campo, y bajo una pregunta de
  elección cada opción, bajo una matriz cada fila y columna. Termina con una vista previa del objeto <code>answers</code> que llevará tu
  callback, con tus claves dentro.
</p>

<p>
  La fila de ayuda de cada opción — la línea gris bajo la opción que estás editando — termina con su clave como un chip. Haz clic en el chip
  para editar la clave en el momento, pulsa Enter o Escape al terminar. Una matriz muestra el chip para la fila o columna cuya etiqueta
  estás editando. Un chip se pone ámbar cuando el formulario está publicado y la clave que escribiste movería la que ya usan las
  automatizaciones.
</p>

<p>
  La misma tabla aparece de solo lectura donde conectas una integración: bajo el mapeo de campos del webhook, y bajo los fragmentos de
  solicitud de la tarjeta de Solicitudes de la hoja de compartir. <code>fields.list</code> también te deja leer todas las claves a la vez.
</p>

<h2 id="derivation">Cómo se deriva una clave</h2>

<p>
  No tienes que configurar nada. Hasta que la edites, una clave se deriva del título de la pregunta: se eliminan los acentos y letras como
  ø, æ y ß pasan a ser o, ae y ss, todo se pone en minúsculas, cada tramo de caracteres que no sea una letra o un dígito se convierte en un
  único guion bajo, los guiones bajos al principio y al final se eliminan, y el resultado se recorta a 64 caracteres.
</p>

<p>
  Un título escrito solo en una escritura no latina, como árabe, hebreo, cirílico, griego, chino o japonés, no tiene nada que normalizar,
  así que su clave es <code>field_</code> más su posición, y la de una opción es <code>option_</code> más su posición. Una vez publicadas,
  estas claves son tan estables como cualquier otra, pero no dicen nada sobre la pregunta. Cuando una automatización lea las respuestas,
  fija tú mismo una clave legible en la tabla de Claves.
</p>

<p>
  Si dos campos acabarían con la misma clave, Formstep resuelve el empate por orden en el documento añadiendo <code>_2</code>,{' '}
  <code>_3</code>, y así sucesivamente. Una clave que fijas tú siempre gana su reclamación, y la derivada cede.
</p>

<h2 id="setting">Fijar tu propia clave</h2>

<p>
  Escribe un nombre en el campo Clave de campo para anular la derivada. Si lo vacías, vuelve a la clave derivada. Los caracteres permitidos
  son letras, dígitos, <code>_</code>, <code>.</code> y <code>-</code>, hasta 64 caracteres — cualquier otra cosa se rechaza con{' '}
  <em>"Usa solo letras, números y _ . - (máximo 64 caracteres)."</em> Los espacios se convierten en guiones bajos mientras escribes, así que
  "nombre de contacto" se convierte en <code>nombre_de_contacto</code>.
</p>

<p>
  Las claves distinguen mayúsculas de minúsculas y deben ser únicas dentro de un mismo formulario. Reutilizar una ya usada por otra
  pregunta, grupo repetible, campo oculto o campo calculado se rechaza con <em>"Otro campo ya usa esta clave."</em>
</p>

<h2 id="freeze">Las claves se congelan en la primera publicación</h2>

> ⚠️ **Renombrar una clave publicada rompe las automatizaciones**
> <p>
>     En un formulario publicado, el campo Clave de campo te avisa de que el formulario está publicado y de que las automatizaciones que usan
>     la clave actual dejarán de funcionar. Nada te lo impide, pero cada flujo de trabajo que precompleta o lee esa clave deja de coincidir en
>     el momento en que publicas el cambio. Actualiza la automatización en la misma sesión. Publicar{' '}
>     <a href="#removed-keys">te avisa de nuevo</a> antes de que el cambio entre en vigor.
>   </p>

<p>
  La primera vez que publicas, la clave de cada campo queda escrita en esa versión publicada. Cada publicación posterior arrastra las mismas
  claves, lo que significa:
</p>

<ul>
  <li>
    <strong>Cambiar el título nunca mueve una clave.</strong> Renombra "Company name" a "Legal entity name" y la clave sigue siendo{' '}
    <code>company_name</code>. Tus automatizaciones siguen funcionando; solo cambian las palabras en la página.
  </li>
  <li>
    <strong>Cambiar el tipo de una pregunta nunca mueve una clave.</strong> Convertir una pregunta de texto en un desplegable conserva su
    clave — aunque la forma de valor que tu automatización debe enviar cambia con ella.
  </li>
  <li>
    <strong>Mover una pregunta nunca mueve su clave.</strong> La posición solo importa para el recurso posicional en un campo que no tiene
    un título utilizable.
  </li>
  <li>
    <strong>Duplicar un bloque le da a la copia una nueva clave.</strong> Una clave que fijaste tú se copia y se renombra al siguiente{' '}
    <code>_2</code> libre; las claves derivadas se hacen únicas al publicar.
  </li>
  <li>
    <strong>Los formularios creados antes de que existieran las claves de campo</strong> reciben las suyas en su siguiente publicación.
  </li>
</ul>

<p>
  Publicar es también donde se detectan los conflictos de claves, y ambos detienen la publicación en lugar de renombrar un campo en
  silencio:
</p>

<ul>
  <li>
    Dos campos que reclaman una misma clave — <em>La clave de campo "…" la usa más de un campo.</em>
  </li>
  <li>
    Una clave que escribiste en un campo y que otro campo ya tenía publicada —{' '}
    <em>
      La clave de campo "…" ya está publicada en "…". Dársela a "…" renombraría la clave de ese campo a "…_2" y rompería las
      automatizaciones que usan "…".
    </em>{' '}
    Libera la clave en uno de los dos y publica de nuevo.
  </li>
</ul>

<p>
  Ambos aparecen junto al botón Publicar con cualquier otro hallazgo previo — consulta{' '}
  <a href="/es/building-forms/publish-checks">Comprobaciones de publicación</a>.
</p>

<h2 id="removed-keys">Cuando una clave publicada está a punto de desaparecer</h2>

<p>
  Una clave pertenece al campo en el que se publicó, no a su título. Así que hay dos formas de perderla sin querer: escribir una clave
  distinta en un campo publicado, o <strong>eliminar una pregunta y añadir una nueva en su lugar</strong>. La pregunta nueva es un campo
  nuevo — recibe una clave nueva derivada de su propio título, y la clave antigua desaparece.
</p>

<p>
  Nada falla del lado de Formstep cuando ocurre esto. El webhook se sigue disparando y el callback sigue llegando, solo que sin esa
  respuesta, y <code>requests.create</code> empieza a rechazar la clave antigua con <code>UNKNOWN_FIELD_KEY</code>. Por eso publicar lo
  comprueba primero. Cuando una clave que publica la versión activa no existiría en la siguiente, el diálogo de publicación y el indicador
  de incidencias junto al botón Publicar muestran una advertencia:
</p>

```
La clave de campo "company_name" dejará de existir después de esta publicación. Las integraciones y solicitudes que la usan dejarán de recibir esa respuesta. Un nuevo campo "Company" se publica como "company". Pon su clave de campo en "company_name" para que sigan funcionando.
```

<ul>
  <li>
    <strong>Para que tus automatizaciones sigan funcionando</strong>, abre la tabla de <strong>Claves</strong>, busca el campo que nombra la
    advertencia, y escribe la clave antigua. La advertencia desaparece y la clave sigue como si nada hubiera pasado.
  </li>
  <li>
    <strong>Si eliminaste el campo a propósito</strong>, publica de todos modos — es una advertencia, no un error — y actualiza las
    automatizaciones que leen esa clave.
  </li>
  <li>
    La advertencia nombra un campo solo cuando la elección es obvia: el campo cuya clave reescribiste, o el único campo nuevo que ocupa el
    lugar de un único campo eliminado. En caso contrario, solo nombra la clave.
  </li>
  <li>
    Eliminar un grupo repetible advierte tanto de la clave del grupo como de la clave de cada campo que contiene. Publicar a través de{' '}
    <code>form_publish</code> del servidor MCP devuelve los mismos mensajes en <code>warnings</code>.
  </li>
  <li>
    Las claves de opción, fila y columna reciben el mismo trato: eliminar una opción o volver a escribir su clave en un formulario publicado
    hace que publicar te avise <em>La clave de opción "pro" de "Plan" dejará de existir después de esta publicación</em>, indicando la clave
    con la que se publica la opción ahora cuando todavía existe. El diálogo de publicación lista cada cambio de clave, en ambos niveles,
    bajo <strong>Claves que cambian en esta publicación</strong>.
  </li>
</ul>

<h2 id="groups">Grupos repetibles y campos ocultos</h2>

<p>
  Un grupo repetible tiene su propia clave, y también cada campo dentro de él. Las automatizaciones se dirigen al grupo como un todo y
  anidan los miembros:
</p>

```
{ "contacts": [{ "name": "Ada", "email": "ada@acme.com" }, { "name": "Grace", "email": "grace@acme.com" }] }
```

<p>
  Un campo dentro de un grupo solo es accesible a través de su grupo — aquí no hay ningún <code>name</code> de nivel superior, solo{' '}
  <code>contacts[0].name</code>. Renombra la clave del grupo y todo el array se mueve; renombra la clave de un miembro y solo cambia ese
  nombre dentro de cada objeto.
</p>

<p>
  El nombre de parámetro de un <a href="/es/building-forms/hidden-fields">campo oculto</a> es su clave de campo. Esa es la clave que pones
  en <code>context</code> al crear una solicitud, y el mismo nombre que usarías en un parámetro de URL en un enlace público.
</p>

<p>
  El nombre de un <a href="/es/building-forms/calculated-fields">campo calculado</a> es su clave de campo, y comparte el mismo conjunto de
  claves del formulario con todo lo demás. Es de solo lectura: el formulario calcula su valor, así que nunca puedes enviarlo —{' '}
  <code>fields.list</code> lo lista con <code>calculated: true</code> y <code>requests.create</code> lo rechaza en <code>prefill</code> y en{' '}
  <code>context</code>. Sí puedes leerlo de vuelta: llega en <code>answers</code> bajo su nombre (<code>answers.total</code>). Renombrar un
  campo calculado publicado renombra su clave, con la misma advertencia de publicación que cualquier otro campo.
</p>

<h2 id="option-keys">Claves de opción: las alternativas dentro de una pregunta</h2>

<p>
  Las partes de una pregunta que una respuesta nombra también tienen claves. Cada opción de una pregunta de radio, desplegable, casillas,
  elección con imágenes o ranking, y cada fila y columna de una matriz, tiene una <strong>clave de opción</strong>: derivada de su etiqueta
  del mismo modo en que se deriva una clave de campo a partir de un título, editable, y congelada al publicar. Así una respuesta se lee como
  un nombre en los dos lados:
</p>

```
{ "plan": "pro", "interests": ["billing", "api"], "satisfaction": { "delivery_speed": "very_good" } }
```

<p>
  Un flujo de trabajo ramifica sobre <code>answers.plan == "pro"</code> sea cual sea el idioma en que respondió el encuestado, y una
  solicitud precompleta una elección con <code>{'{ "plan": "pro" }'}</code>. Las claves las lista <code>fields.list</code> bajo las{' '}
  <code>options</code> de cada campo, o bajo las <code>rows</code> y <code>columns</code> de una matriz, y se editan en la{' '}
  <a href="#where">tabla de Claves</a> o en el chip de la opción. Las opciones de cada pregunta son su propio espacio de nombres, así que
  dos preguntas pueden tener ambas un <code>yes</code>, y una fila y una columna de una matriz pueden compartir clave. Dos opciones de una
  misma pregunta que derivarían la misma clave se distinguen con <code>_2</code>, igual que los campos.
</p>

<p>
  La <a href="/es/requests/decisions-and-approvals">pregunta de decisión</a> es un radio normal cuyas tres opciones llevan las claves{' '}
  <code>approve</code>, <code>decline</code> y <code>changes</code>; eso es lo que hace que el <code>outcome</code> de una solicitud sea un
  conjunto cerrado.
</p>

<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Crear una solicitud](/es/requests/creating-requests) — Pon esas claves a trabajar.
  - [Referencia de webhooks](/es/developers/webhooks-reference) — Cómo dan forma las claves de campo a cada payload de evento.
</div>
