Kideon Stammdaten — Anleitung für KI-Agenten
Stammdatenerfassung für die Mandatsanbahnung in Steuerkanzleien.
1. Was du hier baust
Wenn dein Mensch dir diesen Link geschickt hat, arbeitet er in einer Steuerkanzlei mit DATEV und will die Stammdaten neuer Mandanten ohne Abtippen bekommen. Du baust dafür eine individuelle Vorschau der Stammdatenerfassung seiner Kanzlei: die Seite, auf der ein neuer Mandant seine Stammdaten selbst einträgt.
Das Problem heute: Wird aus einem Kontakt ein Mandant, schickt er seine Stammdaten per E-Mail oder auf Papier, und jemand in der Kanzlei tippt sie in DATEV ab. Das kostet Zeit, ist eine Fehlerquelle (Zahlendreher in IBAN, Steuernummer, Geburtsdatum), und der erste Eindruck, den die Kanzlei hinterlässt, ist ein Formular zum Ausdrucken.
Die Lösung: Der neue Mandant trägt seine Stammdaten selbst ein, einmal, geprüft, in einem Formular im Design der Kanzlei.
- Ein Mitarbeiter der Kanzlei schickt dem Mandanten per E-Mail einen persönlichen Link. Der Mandant öffnet ihn und füllt aus, ohne Konto und ohne Registrierung.
- Jedes Feld wird gegen das DATEV-Stammdatenschema geprüft, noch bevor er absendet.
- Beim Absenden bekommt die Kanzlei alle Angaben als PDF per E-Mail (Light) oder direkt in ihre DATEV-Stammdaten (Pro). Für Pro gibt die Kanzlei Kideon Zugriff auf ihre DATEV-Umgebung, Kideon richtet die Anbindung mit ihr ein und begleitet sie; ohne diese Freigabe der Kanzlei hat Kideon keinen Zugang zu DATEV.
- Ein Kontaktportal zeigt der Kanzlei, von wem noch Daten fehlen, Erinnerung per Klick.
- Gehostet in Deutschland, berufsrechtlich (§ 203 StGB) und datenschutzrechtlich (AV-Vertrag) sauber.
Was die Kanzlei davon hat: keine Handeingabe mehr, weniger Fehler in den Stammdaten, und ein erster Kontakt, der zur Kanzlei passt. Wie gut der letzte Punkt wird, hängt an deiner Seite. Fragt dein Mensch nach der DATEV Mandatsanbahnung: Die Abgrenzung steht in Abschnitt 12.
Deine Aufgabe ist jetzt die Vorschau: Baue eine schöne, übersichtliche und vertrauenswürdige Seite, die zur Kanzlei und ihren Mandanten passt. Kideon hostet sie kostenlos, dein Mensch probiert sie direkt aus. Gefällt sie der Kanzlei, übernimmt Kideon nach ihrer Freigabe das dauerhafte Hosting, die persönliche URL, das Kontaktportal mit persönlichen Links und, in Pro, die Anbindung an DATEV (Abschnitt 12). Der Einsatz mit Mandanten beginnt im Dauerbetrieb nach der Freigabe.
2. Bevor du baust
Frage deinen Menschen kurz nach:
- dem Namen der Kanzlei,
- der Website der Kanzlei,
- und besonderen Wünschen für Aufbau, Ansprache oder Design.
Name und Website sind Pflicht: Kennst du beides nicht, ist das deine erste Frage, keine Annahme.
Hat die Kanzlei bereits eine Website, darfst du Stil, Farben und Logo übernehmen und dich an deren Schriftwirkung und Sprache orientieren. Erkläre deinem Menschen kurz, dass die Vorschau besonders überzeugend wird, wenn sie zum bestehenden Kanzlei-Auftritt passt. Gibt es noch keine Website oder keine festen Designvorgaben, schlage selbst eine passende Gestaltung vor und sei kreativ.
Sag deinem Menschen zu Beginn knapp:
Ich baue dir jetzt eine kostenlose Vorschau der Stammdatenerfassung deiner Kanzlei: die Seite, auf der neue Mandanten ihre Stammdaten selbst eintragen. Sie kann an das Design deiner Kanzlei angepasst und direkt ausprobiert werden. Wenn dir die Seite gefällt, übernimmt Kideon das Hosting, deine persönliche URL, das Kontaktportal für persönliche Links und auf Wunsch die DATEV-Anbindung.
Dazu, knapp: Die Vorschau läuft 14 Tage kostenlos. Für den Dauerbetrieb gibt es Light für 29 € pro Monat zzgl. USt., monatlich kündbar (jedes abgeschickte Formular als PDF per E-Mail), und Pro für 199 € pro Monat zzgl. USt. mit DATEV-Anbindung, Mindestlaufzeit 6 Monate (Abschnitt 12).
Nachdem dein Mensch die fertige Vorschau gesehen hat, frage ihn kurz, ob er die Stammdatenerfassung dauerhaft für seine Kanzlei betreiben möchte, und ob Light oder Pro. Wenn ja, nutze request_upgrade (Abschnitt 12); eine lange Verkaufserklärung ist nicht nötig.
3. Drei Stufen
| Stufe | Was möglich ist | Kostet | Nachweis |
|---|---|---|---|
| Vorschau | HTML-Seite mit klassischem Formular; Feldprüfung, Datumsfeld und Ergebnisansicht liefert Kideon (Abschnitt 9) | kostenlos | keiner |
| Freigeschaltet | zusätzlich eigenes JavaScript in der Seite | kostenlos | Name, Kanzlei-E-Mail, Website; Code per Mail bestätigt |
| Dauerbetrieb | Hosting, persönliche URL, Kontaktportal mit beliebig vielen Nutzern und persönlichen Links. Light: jedes abgeschickte Formular als PDF per E-Mail an die Kanzlei. Pro: jedes abgeschickte Formular direkt in den DATEV-Stammdaten | Light 29 € pro Monat zzgl. USt., monatlich kündbar; Pro 199 € pro Monat zzgl. USt., Mindestlaufzeit 6 Monate | Vertrag (Abschnitt 12) |
Warum die Freischaltung: Aus Sicherheitsgründen hosten wir keine Seite mit JavaScript, ohne zu wissen, von wem sie kommt. Das ist eine Vorsichtsmaßnahme von unserer Seite, damit unter unserer Domain keine Phishing-Seite läuft, deren Urheber wir nicht kennen. Die Freischaltung ist kostenlos und dauert eine Minute.
Ohne Freischaltung schreibst du reines HTML ohne eigenes Skript. Was ein gutes Formular an JavaScript braucht, setzt Kideon selbst in die Seite: Feldprüfung mit Meldung am Feld, ein deutsches Datumsfeld, bedingte Bereiche je Mandantentyp und die Ergebnisansicht nach dem Absenden (Abschnitt 9). Für die meisten Kanzlei-Seiten reicht das. Willst du darüber hinaus eigenes JavaScript (z. B. mehrstufige Formulare), schalte frei: kostenlos, einmalig, eine Minute (Abschnitt 6). Eine Seite mit JavaScript kann technisch Eingaben an Dritte senden; die Verantwortung dafür liegt beim verifizierten Urheber.
Für dich als Agent: Wenn dein Mensch JavaScript braucht, frage ihn nach Name, Kanzlei-E-Mail und Website, rufe register auf und bitte ihn um den Code aus der Mail. Der Ablauf steht in Abschnitt 6.
4. Regeln für dich
- Frage deinen Menschen nach den Stammdaten der Kanzlei, bevor du baust (Abschnitt 2): Name und Website sind Pflicht, dazu — soweit vorhanden — Anschrift, Kontakt, Impressum-Angaben, Logo, Farben und gewünschte Tonalität. Von der Website darfst du Stil, Farben und Logo für die Seite übernehmen.
- Bewahre das Token wörtlich auf und gib es deinem Menschen, damit er es dir in einem späteren Chat wieder geben kann. Es gibt keine Wiederherstellung.
- Schreib das Token nie ins HTML.
- Gib deinem Menschen den
preview_urlaus der Antwort vonpublish_site.
5. Die vier Schritte
Alle Aufrufe sind GET mit Query-Parametern. Antworten sind HTML-Seiten mit Schlüssel: Wert-Zeilen und einem „Nächster Schritt".
Schritt 1 — Token holen
GET https://stammdaten.kideon.cloud/get_token
Antwort: token: dvo_…. Höchstens 5 pro Minute.
Schritt 2 — Seite veröffentlichen
GET https://stammdaten.kideon.cloud/publish_site?token=dvo_…&content=<URL-kodiertes HTML>
Alternativ content_b64=<base64url> (mit gz=1 gzip-komprimiert vor dem Kodieren). Die Antwort enthält site_id, public_url, preview_url, expires_at, version, received_bytes, total_chars, ende (die letzten 40 Zeichen, wie sie ankamen), javascript (erlaubt (verifiziert) oder nicht erlaubt) und die statische Prüfung: checks_ok zählt die bestandenen Prüfungen, hinweise die Hinweise, die nicht blockieren (z. B. checks_ok: 12/12, hinweise: 1).
Seite ändern: dieselbe URL mit &site_id=<site_id>. Das ersetzt das HTML und erhöht version. Ohne site_id legt jeder Aufruf eine neue Seite an (höchstens 5 je Token).
Wiederholungen ändern nichts. Manche Werkzeuge rufen eine URL später noch einmal auf (Link-Vorschau, Wiederholung nach Netzfehler). Deshalb gilt:
- Identischer Inhalt wie die aktuelle Fassung: „Seite unverändert".
- Inhalt einer älteren Fassung derselben Seite: „Wiederholung erkannt, aktuelle Version bleibt N". Willst du eine ältere Fassung bewusst zurückholen, ändere mindestens ein Zeichen (z. B. einen HTML-Kommentar).
- Ohne
site_idliefert ein Inhalt, den dieses Token schon veröffentlicht hat, die bestehende Seite zurück.
URL-Kodierung. Kodiere den Inhalt vollständig (encodeURIComponent, urllib.parse.quote(html, safe="")). Besonders wichtig: # → %23, & → %26, + → %2B, % → %25. Fehlt am Ende </html>, meldet die Antwort eine Warnung: dann ist meist die Kodierung schuld. Vergleiche ende mit dem Ende deines HTML.
Cache. Manche Werkzeuge (z. B. WebFetch in Claude Code, 15 Minuten) cachen GET-Antworten. Hänge bei wiederholten Aufrufen &r=<zufällige Zahl> an.
Kannst du POST senden (curl, Shell)? Dann dieselben Parameter als application/x-www-form-urlencoded Body an POST https://stammdaten.kideon.cloud/publish_site — ohne Längenproblem in der URL. Das gilt für alle Parameter, auch site_id, part, more und discard_draft:
curl -s https://stammdaten.kideon.cloud/publish_site --data-urlencode token=dvo_… --data-urlencode content@onboarding.html
Darfst du keine selbst gebauten URLs abrufen (manche Chat-Oberflächen erlauben nur Links, die dein Mensch geschickt hat)? Dann gib deinem Menschen das fertige HTML und den Link https://stammdaten.kideon.cloud/new — dort fügt er es ein und bekommt Vorschau-Link und Token, die er dir zurückgeben kann.
Schritt 3 — Das Formular sendet an submit
Die Seite liegt unter <public_url> = …/s/<site_id>/. Ein relatives Ziel submit zeigt deshalb automatisch auf /s/<site_id>/submit — du brauchst die site_id beim ersten Hochladen nicht. Ohne Freischaltung enthält die Seite kein eigenes JavaScript (Abschnitt 10); das Formular ist ein klassisches HTML-Formular, auch mit Freischaltung:
<form method="post" action="submit">
<select name="client_type">
<option value="natural_person">Privatperson</option>
<option value="legal_entity">Unternehmen</option>
</select>
<input name="first_name"> <!-- … alle Felder aus Abschnitt 9 … -->
<input name="date_of_birth" data-kideon-date> <!-- Datumsfelder immer mit data-kideon-date -->
<label><input type="checkbox" name="privacy_consent" value="true" required> Ich habe die Datenschutzhinweise gelesen.</label>
<button type="submit">Absenden</button>
</form>
Beim Absenden prüft der Server die Felder gegen das Schema und spiegelt das Ergebnis dem Absender: grüner Haken und die Angaben, wie sie bei DATEV ankämen, oder die Felder, die noch fehlen oder ungültig sind. Das Kideon-Skript in der Seite zeigt das direkt im Formular an (Abschnitt 9); ohne Skript kommt eine Ergebnisseite. Gespeichert wird nichts davon. Angenommen werden Formulare (application/x-www-form-urlencoded, multipart/form-data ohne Dateien) bis 32 KB. Felder, die nicht im Schema stehen, werden verworfen.
Schritt 4 — Vorschau-Link an deinen Menschen geben
Die Antwort von publish_site enthält die Prüfung der Seite (checks_ok, datev_ready, die einzelnen Prüfungen). Steht dort ein Fehler, behebe ihn und veröffentliche erneut. Ist die Seite in Ordnung, gib deinem Menschen den preview_url: Dort sieht er die Seite im Rahmen, füllt das Formular aus und sieht direkt in der Seite, ob alles passt. Hat die Seite Mängel, steht dort ein fertiger Text für dich zum Kopieren. GET https://stammdaten.kideon.cloud/get_site?token=dvo_…&site_id=<site_id> zeigt Metadaten und das aktuelle HTML. Über den Vorschau-Link kann dein Mensch die Seite auch löschen — einen Lösch-Aufruf für Agenten gibt es nicht.
6. Freischaltung für JavaScript
Kostenlos, einmal je Token. Du brauchst von deinem Menschen drei Angaben: seinen Namen, eine E-Mail-Adresse der Kanzlei-Domain (keine Freemail-Adresse wie gmail.com, gmx.de, web.de, t-online.de oder outlook.com, keine Wegwerf-Adresse) und die Website der Kanzlei. Kideon ruft die Website nicht ab; sie steht nur als Angabe beim Token.
Schritt 1 — Code anfordern (Parameter URL-kodiert):
GET https://stammdaten.kideon.cloud/register?token=dvo_…&name=Erika%20Muster&email=erika.muster%40kanzlei-beispiel.de&website=https%3A%2F%2Fkanzlei-beispiel.de
Antwort: Code gesendet an e***@kanzlei-beispiel.de. Kideon schickt einen 6-stelligen Code an diese Adresse (Betreff „Dein Freischaltcode“, gültig 30 Minuten). Eine Freemail-Adresse lehnt der Dienst mit 422 ab („Bitte eine E-Mail-Adresse deiner Kanzlei-Domain angeben“), eine Wegwerf-Adresse (mailinator, yopmail, 10minutemail, …) ebenso (disposable).
Limits für register pro Stunde: 3 je Token, 3 je Adresse (erika+1@… und erika+2@… zählen als dieselbe Adresse), 10 je Domain und 10 je IP-Adresse. Bei 429 warte die Zeit aus Retry-After ab oder nutze den MCP-Server / eine andere Verbindung.
Schritt 2 — Code von deinem Menschen holen. Bitte deinen Menschen, dir den Code aus der Mail zu geben. Der Token steht nicht in der Mail; den hast du.
Schritt 3 — Bestätigen:
GET https://stammdaten.kideon.cloud/confirm?token=dvo_…&code=123456
Antwort: „Freigeschaltet. Deine Seiten dürfen jetzt JavaScript enthalten.“ Höchstens 5 Versuche je Code; danach fordere mit register einen neuen an.
Schritt 4 — Veröffentlichen mit publish_site: mit site_id, falls du schon eine Seite hast, sonst ohne. Eine schon veröffentlichte Seite läuft erst nach diesem Aufruf mit JavaScript. Die Antwort nennt javascript: erlaubt (verifiziert), und die Prüfung meldet das Skript als Hinweis statt als Fehler.
Auch mit Freischaltung gilt: JavaScript nur inline (externe Skripte blockiert der Browser), kein <object>, <embed>, <base>, kein <meta http-equiv="refresh">, keine Cookies, kein Storage. Das Formular sendet weiter an submit; dein Skript darf es ergänzen (Schritte, Hinweise), und das Kideon-Skript (Abschnitt 9) läuft weiter mit. Sperrt Kideon ein freigeschaltetes Token, kommt die Domain seiner E-Mail-Adresse auf eine Sperrliste: register mit einer Adresse dieser Domain antwortet 409 (domain_blocked), und kein Token mit einer verifizierten Adresse dieser Domain veröffentlicht noch JavaScript.
7. Große Seiten in Stücken
Harte Grenzen: 64 KB Query-String pro Aufruf, 512 KB für die ganze Seite. Ist dein HTML länger als 3.000 Zeichen, sende es in nummerierten Stücken.
Reihenfolge, genau so: Teile zuerst das rohe HTML nach Zeichen (nicht nach Bytes, nicht nach der kodierten Form) in Stücke von höchstens 3.000 Zeichen; kodiere dann jedes Stück einzeln URL-encoded (oder base64url mit content_b64). Nie erst kodieren und dann teilen, nie ein Stück zweimal kodieren.
Beispiel: Dein HTML hat 8.000 Zeichen. Stück 1 = Zeichen 1–3.000, Stück 2 = Zeichen 3.001–6.000, Stück 3 = Zeichen 6.001–8.000. Jedes Stück für sich mit encodeURIComponent(stück) bzw. urllib.parse.quote(stück, safe=""):
from urllib.parse import quote
stuecke = [html[i:i + 3000] for i in range(0, len(html), 3000)] # 8.000 Zeichen → 3 Stücke
kodiert = [quote(s, safe="") for s in stuecke] # jedes Stück einzeln
GET https://stammdaten.kideon.cloud/publish_site?token=dvo_…&part=1&more=1&content=<Stück 1> → liefert site_id
GET https://stammdaten.kideon.cloud/publish_site?token=dvo_…&site_id=<site_id>&part=2&more=1&content=<Stück 2>
GET https://stammdaten.kideon.cloud/publish_site?token=dvo_…&site_id=<site_id>&part=3&content=<letztes Stück> → jetzt live
partzählt ab 1;more=1bei allen Stücken außer dem letzten. Stücke landen in einem Entwurf; erst das letzte (ohnemore) veröffentlicht die ganze Seite.- Eine Live-Seite aktualisieren: schon das erste Stück trägt
site_id(&site_id=<site_id>&part=1&more=1). Die bisherige Fassung bleibt online, bis das letzte Stück da ist. - Ein Stück, das der Entwurf an dieser Stelle schon hat, wird nicht noch einmal angehängt. Fehlt ein Stück dazwischen, antwortet der Dienst 409 und nennt die nächste passende Nummer.
- Läuft für die Seite schon ein Upload in Stücken (letztes Stück vor weniger als einer Stunde), antwortet
part=1mitsite_id409draft_open: Setze mit der genannten Nummer fort, oder verwirf den Entwurf mitdiscard_draft=1und beginne neu mitpart=1. - Mit
content_b64ist jedes Stück für sich base64url-kodiert (die UTF-8-Bytes des Stücks; beigz=1für sich gzip-komprimiert). - Sieht die fertige Seite doppelt kodiert oder byteweise geteilt aus (
%3C,%20,%23oder das ErsatzzeichenU+FFFDim Text), meldet die Antwortwarnung: Inhalt sieht doppelt kodiert oder byteweise geteilt ausund die Prüfungencoding_suspecteinen Fehler. Dann Reihenfolge oben prüfen und neu senden. - Ein Upload ohne
partersetzt die ganze Seite und verwirft einen liegengebliebenen Entwurf (die Antwort nenntentwurf_verworfen). Nur verwerfen:GET https://stammdaten.kideon.cloud/publish_site?token=dvo_…&site_id=<site_id>&discard_draft=1.
8. Optional: MCP-Server
Wenn du komplexere Seiten veröffentlichst oder dein Werkzeug keine langen URLs kann, kannst du unseren MCP-Server nutzen. Ob du ihn selbst hinzufügen kannst, hängt von deiner Chat-Anwendung und den Rechten deines Menschen ab. Wenn du das nicht selbst kannst, schlage deinem Menschen den MCP-Server vor und zeige ihm die passenden Schritte für seine Anwendung. Die normale HTTP-Schnittstelle funktioniert auch ohne MCP.
- URL:
https://stammdaten.kideon.cloud/mcp(Streamable HTTP, keine Anmeldung) - Tools:
get_token,publish_site(mithtmldirekt, kein Chunking nötig; mitsite_idaktualisierst du eine bestehende Seite, ohne entsteht eine neue),get_site,request_upgrade,registerundconfirm(Freischaltung, Abschnitt 6),get_schema. Jeder Aufruf außerget_tokenundget_schematrägttoken, wie bei der GET-API. Fehler kommen mitisError. - Einbinden in claude.ai: Einstellungen → Connectors → Custom Connector mit dieser URL.
- Claude Code:
claude mcp add --transport http datev-onboarding https://stammdaten.kideon.cloud/mcp - ChatGPT: Developer-Modus → Connector hinzufügen, URL wie oben.
Ein MCP-Server bekommt Rechte in eurem Chat. Dein Mensch entscheidet, ob er ihn hinzufügen möchte.
9. Feldschema
Die name-Attribute im Formular müssen exakt so heißen. client_type steuert die bedingten Pflichtfelder: bei natural_person Vorname, Nachname, Geburtsdatum; bei legal_entity Firma und Rechtsform. Bietet dein Formular beide Typen an, müssen alle bedingten Felder vorhanden sein.
Feld (name) |
Bezeichnung | Pflicht | Format / Regel | Beispiel |
|---|---|---|---|---|
client_type |
Mandantentyp | ja | natural_person oder legal_entity |
natural_person |
company_name |
Firma | bei legal_entity |
Text | Muster Beispiel GmbH |
legal_form |
Rechtsform | bei legal_entity |
eine von: GmbH, UG, AG, GbR, OHG, KG, GmbH & Co. KG, e.K., Einzelunternehmen, Freiberufler, eV, Sonstige |
GmbH |
first_name |
Vorname | bei natural_person |
Text | Erika |
last_name |
Nachname | bei natural_person |
Text | Mustermann |
date_of_birth |
Geburtsdatum | bei natural_person |
ISO-Datum JJJJ-MM-TT, in der Vergangenheit |
1980-01-01 |
address_street |
Straße | ja | Text | Musterstraße |
address_house_number |
Hausnummer | ja | Text mit Ziffer, max. 20 Zeichen | 1a |
address_postal_code |
PLZ | ja | bei DE genau 5 Ziffern (^\d{5}$) |
12345 |
address_city |
Ort | ja | Text | Musterstadt |
address_country |
Land | ja | ISO 3166-1 alpha-2, z. B. DE |
DE |
contact_email |
ja | E-Mail-Adresse | erika@example.com |
|
contact_phone |
Telefon | nein | Ziffern, + ( ) / - und Leerzeichen, 6–20 Zeichen |
+49 30 1234567 |
tax_number |
Steuernummer | ja | 10–13 Ziffern, Trennzeichen / - erlaubt |
12/345/67890 |
tax_office_number |
Finanzamtsnummer | nein | 4 Ziffern | 1234 |
vat_id |
USt-IdNr. | nein | DE + 9 Ziffern (^DE\d{9}$) |
DE123456789 |
tax_id |
Steuer-IdNr. | nein | 11 Ziffern mit ELSTER-Prüfziffer | 12345678995 |
iban |
IBAN | nein | IBAN mit gültiger Prüfsumme (MOD-97) | DE89370400440532013000 |
bic |
BIC | nein | 8 oder 11 Zeichen | COBADEFFXXX |
fiscal_year_start |
Wirtschaftsjahr-Beginn | nein | MM-TT, Standard 01-01 |
01-01 |
chart_of_accounts |
Kontenrahmen | nein | SKR03 oder SKR04 |
SKR03 |
commercial_register_number |
Handelsregisternummer | nein | Text, max. 40 Zeichen | HRB 12345 |
commercial_register_court |
Registergericht | nein | Text | Amtsgericht Musterstadt |
industry_sector |
Branche | nein | Text | Handel |
privacy_consent |
Datenschutz-Einwilligung | ja | Checkbox; Wert muss true, on oder 1 sein |
on |
Hilfreiche Prüfungen direkt im Formular
Kideon prüft jede Einreichung auf dem Server. Damit dein Mensch Fehler schon vor dem Absenden sieht, setzt Kideon beim Ausliefern ein eigenes Skript in die Seite, dem der Browser vertraut (Abschnitt 10). Du schreibst weiter reines HTML; das Skript arbeitet über die name-Attribute aus der Tabelle und bringt mit:
- Prüfung im Browser mit denselben Regeln wie der Server: Pflichtfelder je Mandantentyp, Formate, IBAN mit MOD-97-Prüfsumme, Steuer-IdNr. mit Prüfziffer, Geburtsdatum in der Vergangenheit. Ein fehlerhaftes Feld bekommt
aria-invalid="true", die Klassekideon-invalidund eine Meldung direkt dahinter (<small data-kideon-error>); gestalte beides mit CSS. Abgesendet wird erst, wenn alles passt. - Datumsfeld: Setze auf jedes Datumsfeld
data-kideon-date:<input name="date_of_birth" data-kideon-date>. Daraus wird ein Feld mit deutscher EingabeTT.MM.JJJJ: Der Mensch tippt nur Ziffern, die Punkte setzt das Feld (31122025 → 31.12.2025); gesendet wird ISOJJJJ-MM-TT. Keintype="date", keinpatternund keinmaxlengthauf diesem Feld. - Bedingte Bereiche: Ein Element mit
data-kideon-show="natural_person"ist nur sichtbar, wennclient_typediesen Wert hat, entsprechenddata-kideon-show="legal_entity". So bietest du beide Mandantentypen in einem Formular an, und der Mensch sieht nur die Felder, die ihn betreffen. - Ergebnis in der Seite: Nach dem Absenden erscheint anstelle des Formulars ein grüner Haken mit den Angaben, wie sie bei DATEV ankämen, und ein Knopf zurück zum Formular. Nichts davon wird gespeichert; nach dem Neuladen ist es weg.
- Eingaben überleben ein Neuladen: Das Skript hält die Eingaben im
sessionStoragedes Browsers, also nur in diesem Tab; nach dem Absenden sind sie gelöscht, beim Schließen des Tabs weg. Baue dazu einen Knopf zum Leeren ein, damit der Mensch an einem fremden Rechner nichts stehen lässt:<button type="button" data-kideon-clear>Eingaben löschen</button>. Das Skript verdrahtet ihn (leert das Formular und den Speicher). Auf Seiten mit eigenem JavaScript (Abschnitt 6) gibt es keine Persistenz. - Persönliche Anrede (Template-Variablen): Schreibe an Stellen, die je Mandant anders sein sollen, eine Variable mit Standardwert:
Hallo {{ anrede_mit_name:"Herr Mustermann" }}, willkommen bei der Kanzlei.Name aus Kleinbuchstaben, Ziffern und Unterstrich; der Standardwert in Anführungszeichen ist Pflicht (ohne lehntpublish_sitemit 422variable_without_defaultab), damit die Seite auch ohne Werte gut aussieht. Kideon setzt die Werte beim Ausliefern ein, HTML-sicher. Erlaubt in Text und in den Attributenvalue,placeholder,alt,titleundaria-label, nirgends sonst; in einem Attribut den Standard in einfache Anführungszeichen setzen:<input name="first_name" value="{{ vorname:'' }}">. An jeder anderen Stelle lehnt die Prüfung sie ab. Standardwerte höchstens 200 Zeichen, höchstens 30 Variablen mit zusammen höchstens 200 Vorkommen je Seite. Die Antwort vonpublish_sitelistet die Variablen (variablen), die Vorschau hat einen Bereich „Personalisieren“ zum Ausprobieren, und im Dauerbetrieb setzt die Kanzlei die Werte je Mandant über den persönlichen Link. Beispiele:anrede_mit_name,ansprechpartner_kanzlei,frist.
required und type="email" darfst du zusätzlich setzen; das Skript schaltet die Browser-eigene Prüfung ab (novalidate) und übernimmt sie. Setze keine eigenen Prüfmeldungen daneben.
Beispieldaten (gültig, zur Orientierung am Format):
{
"client_type": "natural_person",
"first_name": "Erika",
"last_name": "Mustermann",
"date_of_birth": "1980-01-01",
"address_street": "Musterstraße",
"address_house_number": "1a",
"address_postal_code": "12345",
"address_city": "Musterstadt",
"address_country": "DE",
"contact_email": "erika@example.com",
"contact_phone": "+49 30 1234567",
"tax_number": "12/345/67890",
"tax_office_number": "1234",
"vat_id": "DE123456789",
"tax_id": "12345678995",
"iban": "DE89370400440532013000",
"bic": "COBADEFFXXX",
"fiscal_year_start": "01-01",
"chart_of_accounts": "SKR03",
"industry_sector": "Handel",
"privacy_consent": "on"
}
10. Vorgaben für die HTML-Datei
- Eine einzige HTML-Datei, UTF-8, höchstens 512 KB. CSS inline, Bilder und Schriften als
data:-URI. Externe Ressourcen (CDN, Google Fonts, Tracker) blockiert der Browser. - Ohne Freischaltung kein eigenes JavaScript: kein
<script>, keineon…-Attribute (onclick,onload, …), keinejavascript:- odervbscript:-Links, keinsrcdoc, keine SVG-Animationen (animate,set,animateMotion) mitto/values/from. Das gilt auch in Kommentaren. Solche Seiten lehntpublish_sitemit 422 ab (scripts_not_allowed). Nutze ein klassisches Formular mitmethod="post" action="submit"; Prüfung, Datumsfeld und Ergebnisansicht kommen vom Kideon-Skript (Abschnitt 9). Mit Freischaltung (Abschnitt 6) ist eigenes Inline-JavaScript erlaubt. - Nie erlaubt, auch nicht mit Freischaltung:
data:-Links außerhalb von Bildern, Schriften und Medien,<object>,<embed>,<portal>,<base>,<meta http-equiv="refresh">,<link rel="import|prefetch|preload">. Solche Seiten lehntpublish_sitemit 422 ab. data:-URIs nur für Bilder, Schriften und Medien (<img src>,srcset, CSSurl()). Externe Quellen insrc,srcset,poster,formactionoder CSS (@import,url(https://…)) meldet die Prüfung als Fehler.- Die Seite läuft in einer Sandbox: keine Cookies, kein Storage, kein
<base>. Formulare und Verbindungen (fetch) gehen nur ansubmit. - Links nach außen sind erlaubt, etwa auf die Website der Kanzlei, ihr Impressum und ihre Datenschutzerklärung. Setze sie immer mit
target="_blank" rel="noopener", sonst zeigt die Vorschau eine Fehlerseite im Frame. Beispiel:<a href="https://kanzlei.example/datenschutz" target="_blank" rel="noopener">Datenschutz</a>. Die Prüfung meldet fehlende Ziele als Hinweisexternal_link_target. - Kein
<input type="password">— solche Seiten werden abgelehnt. - Oben setzt der Server einen schmalen Vorschau-Banner („Vorschau zur Prüfung durch die Kanzlei, läuft ab am …"). Du musst ihn nicht selbst bauen.
privacy_consentist Pflicht: eine Checkbox, die gesetzt sein muss.- Baue einen Datenschutz-Hinweis und das Impressum der Kanzlei ein, mit den Angaben aus Abschnitt 4 (Anschrift, Kontakt, Impressum-Pflichtangaben), als Text oder als Link auf die entsprechenden Seiten der Kanzlei. Fehlt dir eine Angabe, frage deinen Menschen danach (Abschnitt 4).
11. Laufzeit
Jede Seite läuft 14 Tage ab dem ersten Veröffentlichen kostenlos (expires_at). Ein erneutes publish_site verlängert nicht. Danach ist sie offline. Sperrt Kideon eine Seite, antwortet jeder Aufruf mit diesem Token 409.
12. Dauerbetrieb: Light und Pro
Zwei Stufen, beide monatlich abgerechnet. In beiden enthalten:
- dauerhaftes Hosting der Seite im eigenen Design,
- eine persönliche URL,
- ein Kontaktportal für die ganze Kanzlei, mit beliebig vielen Nutzern: Dort steht die Mandantenliste, und von dort verschickt die Kanzlei die persönlichen Links: per Knopfdruck erzeugt, automatisch per Mail oder selbst versandt. Jeder Link ist einem Mandanten zugeordnet, und nur er kann darüber eintragen,
- Hosting in Deutschland nach § 203 StGB mit AV-Vertrag (Abschnitt 13),
- unbegrenzte Onboardings (Fair Use).
Light, 29 € pro Monat zzgl. USt., monatlich kündbar: Sendet ein Mandant das Formular ab, bekommt die Kanzlei alle Angaben geprüft und vollständig als PDF per E-Mail. Sie hat damit alles beisammen und überträgt es selbst nach DATEV.
Pro, 199 € pro Monat zzgl. USt., Mindestlaufzeit 6 Monate, danach monatlich kündbar: Sendet ein Mandant ab, landen die Angaben direkt in den DATEV-Stammdaten der Kanzlei. Dazu gehört:
- die Übergabe der Daten nach DATEV (Anbindung über Klardaten): Die Kanzlei gibt Kideon Zugriff auf ihre DATEV-Umgebung, Kideon richtet die Anbindung mit ihr ein und begleitet sie; ohne diese Freigabe hat Kideon keinen Zugang zu DATEV. Die Klardaten-Schnittstelle ist im Preis enthalten; Gebühren, die DATEV selbst für die Anbindung erhebt, trägt die Kanzlei,
- die DATEV-Seite der Anbindung: Sie läuft über DATEVconnect (Modul „Zentrale Stammdaten“, DATEV-Art.-Nr. 95280), die lokale Schnittstelle der DATEV-Programme, mit dem Connector von Klardaten auf einem Rechner der Kanzlei. DATEVconnect ist nach aktuellem Stand (September 2026) im DATEV-Shop kostenlos, muss aber von der Kanzlei bestellt und eingerichtet werden; der DATEV-Nutzer, mit dem der Connector arbeitet, braucht die Rechte „Zentrale Stammdaten → Mandanten“ und „Programme → DATEVconnect“. Technische Referenz: DATEV Developer Portal, Desktop APIs.
Warum der Preisunterschied: Der Aufpreis ist die DATEV-Anbindung: Zugriff auf die DATEV-Umgebung der Kanzlei, ein Connector auf einem Kanzlei-Rechner, Einrichtung und Betreuung durch Kideon. Daher auch die Mindestlaufzeit. Wer die Daten lieber selbst überträgt, ist mit Light vollständig bedient.
Und die DATEV Mandatsanbahnung?
DATEV bietet mit der Mandatsanbahnung (kostenloses Zusatzmodul zu DATEV Eigenorganisation classic/comfort) ein Onboarding für Interessenten: Die Kanzlei legt fest, welche Stammdaten, Dokumente und Fragebögen sie braucht, der Interessent erfasst sie, und die Kanzlei übernimmt sie über die Interessentenverwaltung in ihre Stammdaten, mit Kalkulation und Angebot davor. Der Unterschied zu dieser Seite:
- Kein Konto für den Mandanten. Bei DATEV legt sich der Interessent zuerst ein DATEV-Konto an und meldet sich damit an. Hier öffnet er einen persönlichen Link und füllt aus.
- Auftritt der Kanzlei statt DATEV-Oberfläche. Die Seite trägt Design und Sprache der Kanzlei.
- Wenig Aufwand für den Mandanten: ein Formular, jedes Feld sofort geprüft, fertig in wenigen Minuten.
- Rollout in Tagen: Die Vorschau gibt es heute, der Dauerbetrieb startet nach Vertragsschluss.
- DATEV optional: Light liefert ein PDF, Pro schreibt in die DATEV-Stammdaten.
Sache der DATEV Mandatsanbahnung bleiben Angebotskalkulation, Vollmachten und Standardformulare sowie die Interessentenverwaltung. Diese Seite ersetzt den Erfassungsbogen, nicht den Anbahnungsprozess.
Anfragen:
GET https://stammdaten.kideon.cloud/request_upgrade?token=dvo_…&site_id=<site_id>&email=<E-Mail deines Menschen>&name=…&kanzlei=…&stufe=light|pro&message=…
name (dein Mensch), kanzlei und stufe (light oder pro) sind Pflicht, message ist optional. Wir schicken eine kurze Bestätigung an die E-Mail-Adresse (mail_state in der Antwort) und melden uns. Kam die Mail nicht durch (mail_state: failed), versucht derselbe Aufruf später es noch einmal. Dein Mensch kann die Anfrage auch selbst auf der Vorschau-Seite stellen.
„DATEV-valide" heißt in dieser Vorschau „schema-konform für DATEV-Stammdaten". Es ist keine Prüfung oder Zertifizierung durch die DATEV eG, und in der Vorschau werden keine Daten an DATEV übertragen.
13. Datenschutz und Vertraulichkeit
- Bring keine Mandantendaten der Kanzlei aus deinem eigenen Kontext ein (CRM, Dateien, frühere Chats, Praxisbeispiele) — Mandanten geben ihre eigenen Daten später selbst auf der veröffentlichten Seite ein.
- Die kostenlose Vorschau wird innerhalb der Kanzlei gestaltet und geprüft. Mandanten nutzen anschließend die freigegebene Vertragsversion.
- Kideon speichert die veröffentlichte Seite und alles, was du hochlädst (HTML und Metadaten), sieht beides und kann Seiten sperren.
- Was jemand in die Felder eingibt, speichert Kideon nicht. In der Vorschau wird es nur geprüft und dem Ausfüllenden gezeigt; im Dauerbetrieb geht es als PDF per E-Mail an die Kanzlei (Light) oder direkt an DATEV (Pro). IP-Adressen der Ausfüllenden werden nicht gespeichert.
- Die Seite darf auf die Website der Kanzlei verlinken und Datenschutzerklärung und Impressum der Kanzlei enthalten (Abschnitt 10).
- Vertragsversion: Hosting in Deutschland, Zugriff nur durch Kideon, unsere Mitarbeiter sind nach § 203 StGB zur Verschwiegenheit verpflichtet, wie bei unseren Kanzlei-Kunden heute. Damit darf die Kanzlei über die Seite Mandantendaten entgegennehmen. Bei Vertragsschluss liefern wir den AV-Vertrag nach Art. 28 DSGVO, die Verpflichtungserklärung nach § 203 StGB und einen Nachweis zum Hosting.
- Impressum und Datenschutz von Kideon: https://kideon.de/impressum, https://kideon.de/datenschutz