# Entrydeck – Dokumentation
> Das Master-CMS von Kreativ Wolke: ein Inhalt, viele Websites. Produktseite: https://entrydeck.app/ · Übersicht: https://entrydeck.app/docs
---
# Erste Schritte
> Vom leeren Mandanten zur ersten ausgespielten Seite: Anmeldung, Website anlegen, KI-Onboarding oder Handarbeit, API-Key ins Frontend.
Quelle: https://entrydeck.app/docs/erste-schritte · Stand: 2026-09-23
Entrydeck ist ein Master-CMS: Inhalte werden einmal gepflegt und an beliebig viele Websites ausgespielt. Diese Seite führt in der Reihenfolge durch die ersten Schritte, in der sie sich in der Praxis bewährt hat — vom ersten Login bis zur ersten Seite, die ein Frontend über die Delivery-API abruft.
## Was Sie brauchen
- Einen Zugang zum Admin unter `https://entrydeck.app/login`. Den ersten Benutzer legen wir nach der Demo an; weitere Benutzer legen Sie selbst unter **Benutzer** an.
- Eine Vorstellung, welche Inhalte es gibt. Für eine Firmenwebsite reichen meist drei bis fünf Inhaltstypen (etwa Leistungen, Team, Referenzen, Beiträge).
- Optional ein Frontend, das die Inhalte rendert. Entrydeck bringt einen eigenen Renderer mit; wer lieber Nuxt, Next, Astro oder PHP verwendet, nutzt die [Delivery API](https://entrydeck.app/docs/delivery-api).
## Schritt 1: Website anlegen
Unter **Websites → Neu** entsteht der erste Auftritt. Ein Name und die Sprache genügen; Domains lassen sich später ergänzen. Jede Website erhält zwei Kennungen:
| Kennung | Sichtbarkeit | Zweck |
| --- | --- | --- |
| Site-ID | öffentlich | benennt die Website in Skript-Einbindungen und in Anfragen |
| API-Key | geheim | autorisiert das Frontend an der Delivery API |
Der API-Key gehört in die Server-Umgebung des Frontends, nie in Browser-Code. Er lässt sich jederzeit neu erzeugen; der alte verliert dann sofort seine Gültigkeit.
## Schritt 2: Inhalte anlegen — zwei Wege
**Weg A: KI-Onboarding.** Unter **Onboarding** beantworten Sie ein paar Fragen zu Branche, Zielgruppe, Leistungen und Tonalität. Der Assistent baut daraus eine komplette Website: Seiten mit Blöcken und Texten, Inhaltstypen mit Beispieleinträgen, Navigation, Formulare, Platzhalterbilder sowie Impressum und Datenschutzerklärung aus festen Bausteinen. Im letzten Schritt zeigt er den Plan; jede Überschrift und jeder Absatz lässt sich vor dem Anwenden überschreiben oder neu formulieren. Alles landet als ganz normaler Inhalt im System.
**Weg B: Handarbeit.** Zuerst die Inhaltstypen unter **Inhaltstypen** modellieren (Felder, Gruppen, Relationen), dann Einträge unter **Inhalte** anlegen, dann Seiten unter **Seiten** aus Blöcken zusammensetzen. Wer bestehende Inhalte aus WordPress, TYPO3 oder einer beliebigen JSON-, REST- oder GraphQL-Quelle hat, zieht sie über den [Content-Mapper](https://entrydeck.app/docs/content-mapper) herüber.
> Der Assistent überschreibt nie bestehende Seiten. Ein zweiter Durchlauf legt eine neue Sitzung und eine neue Website an.
## Schritt 3: Veröffentlichen
Einträge und Seiten durchlaufen Arbeitszustände: **Entwurf → In Prüfung → Freigegeben → Veröffentlicht**. Erst „Veröffentlicht" ist über die Delivery API abrufbar — unabhängig davon, ob eine Seite den Eintrag bereits anzeigt. Wer welchen Schritt gehen darf, steuern Rollen und Rechte unter **Einstellungen → Rollen**.
## Schritt 4: Das Frontend anschließen
Ein erster Aufruf zeigt, ob alles verbunden ist:
```bash
curl https://entrydeck.app/api/v1/delivery/site \
-H "x-api-key: $ENTRYDECK_API_KEY"
```
Die Antwort enthält Site-ID, Name, Sprachen, Domains, SEO-Einstellungen und das Theme der Website. Danach holt das Frontend Seiten über `GET /delivery/page?route=/&locale=de` und Einträge über `GET /delivery/content/{typ}` — alle Details stehen in der [Delivery API](https://entrydeck.app/docs/delivery-api).
## Schritt 5: Consentdeck und Barrierefreiheit einschalten
Beides ist in jedem Paket enthalten und je Website konfigurierbar:
- **Consentdeck** unter **Consentdeck → Website**: Kategorien und Dienste pflegen, Banner einschalten. Websites, die Entrydeck rendert, binden das Skript automatisch ein; fremde Websites bekommen ein `
```
Die **Site-ID** ist öffentlich und benennt nur die Website; ein Schlüssel wird nicht benötigt. Websites, die Entrydeck selbst rendert, binden das Skript automatisch ein, sobald das Banner eingeschaltet ist.
| Umgebung | Einbindung |
| --- | --- |
| WordPress ab 6.0 | Plugin `consentdeck.zip` mit Einstellungsseite, Shortcode `[consentdeck_declaration]`, Gutenberg-Block |
| TYPO3 v12/v13 | Extension `consentdeck` mit TypoScript-Einbindung und Inhaltselement für die Erklärung |
| Shopware 6 ab 6.5 | Plugin `KwConsentdeck` für Storefront und Checkout |
| Joomla 5 | System-Plugin `plg_system_consentdeck` |
| Nuxt | `app.head.script` in der `nuxt.config` |
| Next.js | `
```
Für Karten und Videos erscheint statt der Einbettung ein Platzhalter mit dem Text aus den Einstellungen und einem Schalter, der genau diesen Dienst freigibt.
## Google Consent Mode v2 und dataLayer
Vor dem ersten Google-Tag stehen alle Signale (`ad_storage`, `ad_user_data`, `ad_personalization`, `analytics_storage`, …) auf `denied` und werden nach der Entscheidung aktualisiert (`wait_for_update: 500`). Zusätzlich schreibt Consentdeck zwei Ereignisse in `window.dataLayer`: `consent_initialized` einmal je Seitenaufruf und `consent_update` nach jeder Entscheidung — mit Kategorien, Diensten, Einwilligungs-ID und Version.
## GTM-Export
Unter **Tag Manager & Doku** erzeugt Consentdeck einen fertigen Container: dataLayer-Variablen `Consent - …` je Kategorie, Trigger `Consent Initialized`, `Consent Update` und `Consent Granted - …` je optionaler Kategorie sowie Tags der eingerichteten Dienste. Im Tag Manager unter *Verwaltung → Container importieren* einspielen (Zusammenführen, Konflikte umbenennen), prüfen, veröffentlichen. Eigene Tags hängen an den Trigger der passenden Kategorie, nicht an *All Pages*.
Der Tag Manager gehört nicht ohne Weiteres in die notwendigen Dienste: Er darf nur dann vorab laden, wenn jedes Tag im Container den Consent Mode beachtet.
## Steuerung aus eigenem Code
```js
Consentdeck.open() // Einstellungen erneut öffnen
Consentdeck.acceptAll() // alles zulassen
Consentdeck.accept('analytics') // eine Kategorie zulassen
Consentdeck.reject() // nur notwendige
Consentdeck.withdraw() // Einwilligung widerrufen
Consentdeck.has('analytics') // true, wenn zugestimmt wurde
Consentdeck.get() // { id, version, ts, action, categories, services }
Consentdeck.on('change', fn) // bei jeder Änderung
```
Für den Link „Cookie-Einstellungen" im Fußbereich genügt `