# Feldschlüssel

Die stabilen Namen, mit denen Automationen deine Felder ansprechen — woher sie kommen und wie du sie stabil hältst.

## Feldschlüssel

Ein Feldschlüssel ist der entwicklerseitige Name eines Felds in einem Formular — company_name, contacts. So füllt eine Automation ein Feld voraus, sperrt es oder liest die Antwort aus, und er übersteht Umbenennungen und Duplizieren.

<h2 id="why">Warum es sie gibt</h2>

<p>
  Ohne Feldschlüssel müsste eine Automation deine Fragen über interne IDs ansprechen, die niemandem etwas sagen — und ein Webhook-Payload
  käme voll davon an. Mit Feldschlüsseln lesen sich beide Seiten gleich:
</p>

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

<p>
  Feldschlüssel werden an zwei Stellen verwendet: in <code>prefill</code>, <code>context</code> und <code>readonly</code> beim Erstellen
  eines Requests; und in den <code>answers</code>- und <code>display</code>-Maps in jedem Callback und jedem Webhook-Payload.
</p>

<h2 id="where">Wo du sie findest</h2>

<p>
  Jeder Schlüssel, den das Formular veröffentlicht, lebt an einem Ort, der <strong>Schlüssel</strong>-Tabelle: jedes Feld, und unter einer
  Auswahlfrage jede Option, unter einer Matrix jede Zeile und Spalte. Sie endet mit einer Vorschau des <code>answers</code>-Objekts, das
  dein Callback tragen wird, mit deinen Schlüsseln darin.
</p>

<p>
  Die Hinweiszeile jeder Option — die graue Zeile unter der Option, die du bearbeitest — endet mit ihrem Schlüssel als Chip. Klicke auf den
  Chip, um den Schlüssel direkt zu bearbeiten, drücke Enter oder Escape, wenn du fertig bist. Eine Matrix zeigt den Chip für die Zeile oder
  Spalte, deren Label du bearbeitest. Ein Chip wird gelb, wenn das Formular veröffentlicht ist und der eingegebene Schlüssel den verschieben
  würde, den Automationen bereits verwenden.
</p>

<p>
  Dieselbe Tabelle erscheint schreibgeschützt, wo du eine Integration verdrahtest: unter der Feldzuordnung des Webhooks und unter den
  Request-Snippets in der Requests-Karte des Share-Sheets. Du kannst auch alle Schlüssel auf einmal mit <code>fields.list</code> auslesen.
</p>

<h2 id="derivation">Wie ein Schlüssel abgeleitet wird</h2>

<p>
  Du musst nichts einstellen. Bis du ihn bearbeitest, wird ein Schlüssel aus dem Titel der Frage abgeleitet: Akzente werden aufgelöst und
  Buchstaben wie ø, æ und ß werden zu o, ae und ss, alles wird kleingeschrieben, jede Folge von Zeichen, die weder Buchstabe noch Ziffer
  sind, wird zu einem einzelnen Unterstrich, führende und abschließende Unterstriche fallen weg, und das Ergebnis wird auf 64 Zeichen
  gekürzt.
</p>

<p>
  Ein Titel, der nur in einer nicht-lateinischen Schrift geschrieben ist, etwa Arabisch, Hebräisch, Kyrillisch, Griechisch, Chinesisch oder
  Japanisch, lässt sich nicht auflösen. Sein Schlüssel ist deshalb <code>field_</code> plus seine Position, der einer Option
  <code>option_</code> plus ihre Position. Nach der Veröffentlichung sind diese Schlüssel so stabil wie jeder andere, sagen aber nichts über
  die Frage aus. Liest eine Automation die Antworten, setze selbst einen lesbaren Schlüssel in der Schlüssel-Tabelle.
</p>

<p>
  Würden zwei Felder auf denselben Schlüssel kommen, löst Formstep den Konflikt in Dokumentreihenfolge auf, indem <code>_2</code>,{' '}
  <code>_3</code> und so weiter angehängt wird. Ein selbst gesetzter Schlüssel gewinnt immer seinen Anspruch, der abgeleitete weicht.
</p>

<h2 id="setting">Deinen eigenen Schlüssel setzen</h2>

<p>
  Gib einen Namen ins Feldschlüssel-Eingabefeld ein, um den abgeleiteten zu überschreiben. Leerst du das Feld, wird wieder der abgeleitete
  Schlüssel verwendet. Erlaubte Zeichen sind Buchstaben, Ziffern, <code>_</code>, <code>.</code> und <code>-</code>, bis zu 64 Zeichen —
  alles andere wird abgelehnt mit <em>"Use only letters, numbers and _ . - (max 64 characters)."</em> Leerzeichen werden beim Tippen in
  Unterstriche umgewandelt, sodass aus "contact name" <code>contact_name</code> wird.
</p>

<p>
  Schlüssel unterscheiden Groß- und Kleinschreibung und müssen innerhalb eines Formulars eindeutig sein. Einen bereits von einer anderen
  Frage, Wiederholungsgruppe, einem versteckten Feld oder berechneten Feld belegten Schlüssel wiederzuverwenden wird abgelehnt mit{' '}
  <em>"Another field already uses this key."</em>
</p>

<h2 id="freeze">Schlüssel frieren bei der ersten Veröffentlichung ein</h2>

> ⚠️ **Einen veröffentlichten Schlüssel umzubenennen bricht Automationen**
> <p>
>     Bei einem veröffentlichten Formular warnt das Feldschlüssel-Eingabefeld dich, dass das Formular veröffentlicht ist und Automationen, die
>     den aktuellen Schlüssel verwenden, kaputtgehen. Nichts hält dich auf, aber jeder Workflow, der diesen Schlüssel vorausfüllt oder liest,
>     hört in dem Moment auf zu passen, in dem du die Änderung veröffentlichst. Aktualisiere die Automation in derselben Sitzung. Die
>     Veröffentlichung <a href="#removed-keys">warnt dich erneut</a>, bevor die Änderung live geht.
>   </p>

<p>
  Beim ersten Veröffentlichen wird der Schlüssel jedes Felds in diese veröffentlichte Version geschrieben. Jede spätere Veröffentlichung
  trägt dieselben Schlüssel weiter, was bedeutet:
</p>

<ul>
  <li>
    <strong>Umbenennen verschiebt nie einen Schlüssel.</strong> Benenne "Company name" in "Legal entity name" um, und der Schlüssel bleibt{' '}
    <code>company_name</code>. Deine Automationen funktionieren weiter; nur die Wörter auf der Seite ändern sich.
  </li>
  <li>
    <strong>Den Typ einer Frage zu ändern verschiebt nie einen Schlüssel.</strong> Eine Textfrage in ein Dropdown umzuwandeln behält ihren
    Schlüssel — auch wenn sich die Wertform ändert, die deine Automation senden muss.
  </li>
  <li>
    <strong>Eine Frage zu verschieben verschiebt nie ihren Schlüssel.</strong> Die Position spielt nur beim positionsbasierten Fallback für
    ein Feld ohne brauchbaren Titel eine Rolle.
  </li>
  <li>
    <strong>Einen Block zu duplizieren gibt der Kopie einen neuen Schlüssel.</strong> Ein selbst gesetzter Schlüssel wird kopiert und auf
    das nächste freie <code>_2</code> umbenannt; abgeleitete Schlüssel werden bei der Veröffentlichung eindeutig gemacht.
  </li>
  <li>
    <strong>Formulare, die vor Feldschlüsseln gebaut wurden,</strong> bekommen ihre bei der nächsten Veröffentlichung.
  </li>
</ul>

<p>
  Auch bei der Veröffentlichung werden Schlüsselkollisionen entdeckt, und beide stoppen die Veröffentlichung, statt ein Feld stillschweigend
  umzubenennen:
</p>

<ul>
  <li>
    Zwei Felder beanspruchen denselben Schlüssel — <em>Field key "…" is used by more than one field.</em>
  </li>
  <li>
    Ein Schlüssel, den du auf ein Feld getippt hast, den ein anderes Feld bereits veröffentlicht hat —{' '}
    <em>
      Field key "…" is already published on "…". Giving it to "…" would rename that field's key to "…_2" and break automations using "…".
    </em>{' '}
    Gib den Schlüssel bei einem der beiden frei und veröffentliche erneut.
  </li>
</ul>

<p>
  Beide erscheinen neben dem Veröffentlichen-Button, zusammen mit jedem anderen Pre-Flight-Befund — siehe{' '}
  <a href="/de/building-forms/publish-checks">Veröffentlichungsprüfungen</a>.
</p>

<h2 id="removed-keys">Wenn ein veröffentlichter Schlüssel gleich verschwindet</h2>

<p>
  Ein Schlüssel gehört zu dem Feld, auf dem er veröffentlicht wurde, nicht zu seinem Titel. Es gibt also zwei Wege, einen ungewollt zu
  verlieren: einen anderen Schlüssel auf ein veröffentlichtes Feld tippen, oder{' '}
  <strong>eine Frage löschen und an ihrer Stelle eine neue hinzufügen</strong>. Die neue Frage ist ein neues Feld — sie bekommt einen
  frischen, aus ihrem eigenen Titel abgeleiteten Schlüssel, und der alte Schlüssel ist weg.
</p>

<p>
  Auf Formstep-Seite schlägt dabei nichts fehl. Der Webhook feuert weiterhin und der Callback kommt weiterhin an, nur ohne diese Antwort,
  und <code>requests.create</code> fängt an, den alten Schlüssel mit <code>UNKNOWN_FIELD_KEY</code> abzulehnen. Deshalb prüft die
  Veröffentlichung das zuerst. Würde ein Schlüssel, den die aktuelle Version veröffentlicht, in der nächsten nicht mehr existieren, zeigen
  der Veröffentlichungsdialog und die Problemanzeige neben dem Veröffentlichen-Button eine Warnung:
</p>

```
Feldschlüssel "company_name" wird nach dieser Veröffentlichung nicht mehr existieren. Integrationen und Anfragen, die ihn verwenden, erhalten diese Antwort nicht mehr. Ein neues Feld "Company" wird als "company" veröffentlicht. Setze seinen Feldschlüssel auf "company_name", damit sie weiter funktionieren.
```

<ul>
  <li>
    <strong>Damit deine Automationen weiter funktionieren</strong>, öffne die <strong>Schlüssel</strong>-Tabelle, finde das Feld, das die
    Warnung nennt, und tippe den alten Schlüssel ein. Die Warnung verschwindet, und der Schlüssel läuft weiter, als wäre nichts gewesen.
  </li>
  <li>
    <strong>Hast du das Feld absichtlich entfernt</strong>, veröffentliche trotzdem — es ist eine Warnung, kein Fehler — und aktualisiere
    die Automationen, die den Schlüssel lesen.
  </li>
  <li>
    Die Warnung nennt ein Feld nur, wenn die Wahl eindeutig ist: das Feld, dessen Schlüssel du neu getippt hast, oder das einzige neue Feld,
    das dort steht, wo ein einzelnes gelöschtes stand. Sonst nennt sie nur den Schlüssel.
  </li>
  <li>
    Eine Wiederholungsgruppe zu löschen warnt für den Schlüssel der Gruppe und für den Schlüssel jedes Felds darin. Das Veröffentlichen über{' '}
    <code>form_publish</code> des MCP-Servers liefert dieselben Meldungen in <code>warnings</code> zurück.
  </li>
  <li>
    Options-, Zeilen- und Spaltenschlüssel bekommen dieselbe Behandlung: Löschst du eine Option oder änderst ihren Schlüssel in einem
    veröffentlichten Formular, warnt das Veröffentlichen{' '}
    <em>Der Optionsschlüssel „pro" von „Plan" wird nach dieser Veröffentlichung nicht mehr existieren</em>, und nennt den Schlüssel, unter
    dem die Option jetzt veröffentlicht wird, wenn sie noch existiert. Der Veröffentlichungsdialog listet jede Schlüsseländerung, auf beiden
    Ebenen, unter <strong>Schlüssel, die sich mit dieser Veröffentlichung ändern</strong>.
  </li>
</ul>

<h2 id="groups">Wiederholungsgruppen und versteckte Felder</h2>

<p>
  Eine <a href="/de/building-forms/repeating-groups">Wiederholungsgruppe</a> hat ihren eigenen Schlüssel, ebenso jedes Feld darin.
  Automationen sprechen die Gruppe als Ganzes an und verschachteln die Mitglieder:
</p>

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

<p>
  Ein Feld innerhalb einer Gruppe ist nur über seine Gruppe erreichbar — hier gibt es kein <code>name</code> auf oberster Ebene, nur{' '}
  <code>contacts[0].name</code>. Benennst du den Schlüssel der Gruppe um, verschiebt sich das ganze Array; benennst du den Schlüssel eines
  Mitglieds um, ändert sich nur dieser Name innerhalb jedes Objekts.
</p>

<p>
  Der Parametername eines <a href="/de/building-forms/hidden-fields">versteckten Felds</a> ist sein Feldschlüssel. Das ist der Schlüssel,
  den du beim Erstellen eines Requests in <code>context</code> angibst — derselbe Name, den du auch als URL-Parameter bei einem öffentlichen
  Link verwenden würdest.
</p>

<p>
  Der Name eines <a href="/de/building-forms/calculated-fields">berechneten Felds</a> ist sein Feldschlüssel, und es teilt sich das eine
  Schlüssel-Set des Formulars mit allem anderen. Es ist nur lesbar: Das Formular ermittelt seinen Wert selbst, du kannst also nie einen
  senden — <code>fields.list</code> listet es mit <code>calculated: true</code> auf, und <code>requests.create</code> lehnt es in{' '}
  <code>prefill</code> und <code>context</code> ab. Zurücklesen kannst du es aber: Es erscheint in <code>answers</code> unter seinem Namen (
  <code>answers.total</code>). Ein veröffentlichtes berechnetes Feld umzubenennen benennt auch seinen Schlüssel um, mit derselben
  Veröffentlichungswarnung wie bei jedem anderen Feld.
</p>

<h2 id="option-keys">Optionsschlüssel: die Auswahlmöglichkeiten in einer Frage</h2>

<p>
  Auch die Teile einer Frage, die eine Antwort benennt, bekommen Schlüssel. Jede Option eines Radio-, Auswahl-, Checkbox-, Bildauswahl- oder
  Ranking-Fragen, und jede Zeile und Spalte einer Matrix, hat einen <strong>Optionsschlüssel</strong>: abgeleitet aus ihrem Label auf
  dieselbe Weise, wie ein Feldschlüssel aus einem Titel abgeleitet wird, bearbeitbar und bei der Veröffentlichung eingefroren. So liest sich
  eine Antwort auf beiden Seiten als Name:
</p>

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

<p>
  Ein Workflow verzweigt auf <code>answers.plan == "pro"</code>, in welcher Sprache die befragte Person auch geantwortet hat, und ein
  Request füllt eine Auswahl mit <code>{'{ "plan": "pro" }'}</code> vor. Die Schlüssel werden von <code>fields.list</code> unter den{' '}
  <code>options</code> jedes Felds aufgeführt, oder den <code>rows</code> und <code>columns</code> einer Matrix, und in der{' '}
  <a href="#where">Schlüsseltabelle</a> oder am Chip der Option bearbeitet. Die Optionen jeder Frage sind ihr eigener Namensraum, sodass
  zwei Fragen beide ein <code>yes</code> haben können, und eine Zeile und Spalte einer Matrix sich einen Schlüssel teilen können. Zwei
  Optionen einer Frage, die denselben Schlüssel ableiten würden, werden mit <code>_2</code> auseinandergehalten, wie bei Feldern.
</p>

<p>
  Die <a href="/de/requests/decisions-and-approvals">Entscheidungsfrage</a> ist ein gewöhnliches Radio, dessen drei Optionen die Schlüssel{' '}
  <code>approve</code>, <code>decline</code> und <code>changes</code> tragen; das macht das <code>outcome</code> eines Requests zu einer
  geschlossenen Menge.
</p>

<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Einen Request erstellen](/de/requests/creating-requests) — Diese Schlüssel einsetzen.
  - [Webhook-Referenz](/de/developers/webhooks-reference) — Wie Feldschlüssel jedes Event-Payload formen.
</div>
