Skip to content

Preisvererbung ​

In diesem Kapitel erfährst du, wie das Preissystem von CampsiteHero funktioniert: Wie Preise auf zwei Ebenen definiert werden, wie Saison-Preise Vorrang haben und welche Kombination am Ende gilt.

Währung: Alle Preise in der Preismatrix sind in der Platz-Währung gespeichert (z.B. € oder CHF). Welche Währung dein Campingplatz verwendet, siehst du unter Einstellungen → Campingplatz → Stammdaten. Mehr dazu im Kapitel Währung.

Übersicht ​

CampsiteHero nutzt ein Vererbungssystem für Preise. Das bedeutet: Du musst Preise nicht für jede einzelne Parzelle separat eingeben. Stattdessen kannst du globale Grundpreise setzen und diese bei Bedarf auf Parzellen-Ebene überschreiben.

Preise können auf drei Ebenen definiert werden:

EbeneWo konfigurierenGilt für
CampingplatzTarife & Regeln → PreiseAlle Parzellen (globale Basis)
KategorieTarife & Regeln → Preise → Kategorie-SpalteAlle Parzellen dieser Kategorie
ParzelleParzellen → Parzelle öffnen → Tab PreiseNur diese einzelne Parzelle

Grundprinzip: Die spezifischere Ebene hat Vorrang. Ein Kategorie-Preis überschreibt den Campingplatz-Preis, ein Parzellen-Preis überschreibt den Kategorie-Preis.

Zusätzlich gibt es pro Ebene zwei Preistypen:

  • Basis-Preis – gilt, wenn keine Saison aktiv ist (ganzjähriger Fallback)
  • Saison-Preis – gilt in einem definierten Zeitraum (z.B. Hauptsaison Juli–August)

Der Grundpreis kennt keine Campingplatz-Ebene. Den Übernachtungspreis einer Parzelle setzt du auf der Parzelle oder auf der Kategorie – einen platzweiten Grundpreis für alle Parzellen gibt es bewusst nicht. Personen- und Vehikelpreise dagegen haben alle drei Ebenen.


Die Vererbungshierarchie ​

Campingplatz (globale Basis)
    └── Kategorie (Override für alle Parzellen dieser Kategorie)
            └── Parzelle (Override für genau diese Parzelle)

Jede Ebene kann Preise setzen oder leer lassen. Ist eine Ebene leer, wird die nächst höhere Ebene verwendet.

Tabellarische Übersicht ​

Parzelle hat eigenen Preis?Kategorie hat Preis?Campingplatz hat Preis?Ergebnis
✅ JabeliebigbeliebigParzellen-Preis gilt
❌ Nein✅ JabeliebigKategorie-Preis gilt
❌ Nein❌ Nein✅ JaCampingplatz-Preis gilt
❌ Nein❌ Nein❌ NeinKein Preis definiert

Die Auflösungsreihenfolge ​

Für jede Preisanfrage (Kombination aus Saison und Gästekategorie/Vehikeltyp) arbeitet das System eine feste Prüfliste ab. Der erste Treffer gewinnt – danach wird nicht weitergesucht.

Die Liste ist nach Ebenen geordnet, und innerhalb einer Ebene steht der Saison-Preis vor dem Basis-Preis:

Parzellen-Grundpreis ​

#Geprüft wird
1Parzelle – Saison-Preis
2Parzelle – Basis-Preis
3Kategorie – Saison-Preis
4Kategorie – Basis-Preis

Findet sich nichts, hat die Parzelle keinen Grundpreis – und ist damit nicht buchbar (siehe Ohne Grundpreis nicht buchbar).

Personen- und Vehikelpreis ​

#Geprüft wird
1Parzelle – Saison-Preis
2Parzelle – Basis-Preis
3Kategorie – Saison-Preis
4Kategorie – Basis-Preis
5Campingplatz – Saison-Preis
6Campingplatz – Basis-Preis

Findet sich nichts, kostet diese Gästekategorie bzw. dieser Vehikeltyp nichts (0,00 €).

Flussdiagramm: Personen- und Vehikelpreis ​

mermaid
flowchart TD
    A([Preisanfrage:\nSaison + Gästekategorie]) --> B{Parzelle hat\nSaison-Preis?}

    B -- Ja --> R1([Preis verwenden\nQuelle: Parzelle / Saison])
    B -- Nein --> C{Parzelle hat\nBasis-Preis?}

    C -- Ja --> R2([Preis verwenden\nQuelle: Parzelle / Basis])
    C -- Nein --> D{Kategorie hat\nSaison-Preis?}

    D -- Ja --> R3([Preis verwenden\nQuelle: Kategorie / Saison])
    D -- Nein --> E{Kategorie hat\nBasis-Preis?}

    E -- Ja --> R4([Preis verwenden\nQuelle: Kategorie / Basis])
    E -- Nein --> F{Campingplatz hat\nSaison-Preis?}

    F -- Ja --> R5([Preis verwenden\nQuelle: Campingplatz / Saison])
    F -- Nein --> G{Campingplatz hat\nBasis-Preis?}

    G -- Ja --> R6([Preis verwenden\nQuelle: Campingplatz / Basis])
    G -- Nein --> R7([Kein Preis gefunden])

Wichtige Regel: „Ebene schlägt Saison" ​

Dies ist die wichtigste Eigenschaft der Auflösung: Die speziellere Ebene gewinnt immer – auch mit einem Basis-Preis gegen einen Saison-Preis der allgemeineren Ebene.

Hat eine Parzelle einen eigenen Basis-Preis, gilt dieser das ganze Jahr – auch in der Hauptsaison, selbst wenn der Campingplatz für diese Saison einen anderen Preis hinterlegt hat.

Zusammengefasst:

  • Erst die Ebene (Parzelle → Kategorie → Campingplatz), dann innerhalb der Ebene Saison vor Basis
  • Ein Basis-Preis auf Parzellen-Ebene hat Vorrang vor einem Saison-Preis des Campingplatzes

Diagramm: Ebene schlägt Saison ​

mermaid
flowchart LR
    subgraph Szenario["Szenario: Hauptsaison aktiv"]
        direction TB
        PAR["Parzelle\nNur Basis-Preis: 12 €\nKein Saison-Preis"]
        CS["Campingplatz\nHauptsaison-Preis: 15 €"]
    end

    PAR -->|"Parzellen-Basis-Preis gefunden!"| ERG["Ergebnis: 12 €\nvon der Parzelle"]
    CS -.->|"wird nicht mehr geprüft"| ERG

    style ERG fill:#22c55e,color:#fff
    style PAR fill:#3b82f6,color:#fff

Der Hauptsaison-Preis des Campingplatzes (15 €) kommt nicht zum Zug, weil die Prüfliste schon beim Basis-Preis der Parzelle (12 €) endet.

Was heißt das für die Praxis? Sobald du auf einer Parzelle einen Preis setzt, koppelst du sie von den Saison-Preisen darüber ab. Soll sie in der Hauptsaison teurer werden, brauchst du dort einen eigenen Saison-Preis. Willst du das nicht pflegen, lass die Parzelle leer – dann greifen Kategorie und Campingplatz mit ihren Saison-Preisen.


Praxisbeispiele ​

Beispiel 1: Einfache Vererbung ohne Overrides ​

Du betreibst einen Campingplatz mit 30 Parzellen in einer einzigen Kategorie „Standard". Du möchtest einheitliche Preise setzen, die für alle gelten.

Konfiguration:

EbenePreistypBasis-PreisHauptsaison
Kategorie „Standard"Grundpreis12,00 €18,00 €
CampingplatzErwachsener5,00 €7,00 €
CampingplatzKind2,50 €3,50 €

Alle Parzellen lassen die Preise leer (kein Override).

Ergebnis:

  • Im Juli (Hauptsaison): Parzelle 18,00 €, Erwachsener 7,00 €, Kind 3,50 €
  • Im März (keine Saison aktiv): Parzelle 12,00 €, Erwachsener 5,00 €, Kind 2,50 €

Vorteil: Eine zentrale Stelle, keine Redundanz.

Warum steht der Grundpreis bei der Kategorie? Weil es für den Grundpreis keine Campingplatz-Ebene gibt. Hast du nur eine Kategorie, ist deren Grundpreis faktisch dein platzweiter Preis.


Beispiel 2: Kategorie-Grundpreis für unterschiedliche Kategorien ​

Du hast zwei Kategorien – „Premium" und „Standard" – mit unterschiedlichen Parzellenpreisen. Alle Parzellen einer Kategorie sollen denselben Preis haben.

Konfiguration:

EbeneKategorieParzelle (Basis)Hauptsaison
KategoriePremium18,00 €25,00 €
KategorieStandard12,00 €16,00 €

Alle Parzellen lassen die Preise leer und erben von ihrer Kategorie.

Ergebnis für Premium-Parzellen:

  • Hauptsaison: 25,00 € (von der Kategorie)
  • Außerhalb Saison: 18,00 € (von der Kategorie)

Ergebnis für Standard-Parzellen:

  • Hauptsaison: 16,00 € (von der Kategorie)
  • Außerhalb Saison: 12,00 € (von der Kategorie)

Vorteil: Preise nach Kategorien gestaffelt, ohne jede Parzelle einzeln zu bearbeiten.


Beispiel 3: Parzelle überschreibt Kategorie-Preis ​

Du hast eine Sonderparzelle (z.B. mit Seeblick), die generell teurer sein soll als die restlichen Parzellen ihrer Kategorie.

Konfiguration:

EbeneParzelle (Basis)Hauptsaison
Kategorie „Standard"12,00 €18,00 €
Parzelle „A-01" (Seeblick)15,00 €22,00 €

Alle anderen Parzellen lassen die Preise leer und erben von der Kategorie.

Ergebnis für Standard-Parzellen:

  • Hauptsaison: 18,00 € (von der Kategorie)
  • Außerhalb Saison: 12,00 € (von der Kategorie)

Ergebnis für Parzelle A-01:

  • Hauptsaison: 22,00 € (von der Parzelle – überschreibt Kategorie)
  • Außerhalb Saison: 15,00 € (von der Parzelle – überschreibt Kategorie)

Beispiel 4: Die „Ebene schlägt Saison"-Regel in der Praxis ​

Der erklärungsbedürftigste Fall: Eine Parzelle hat nur einen Basis-Preis, die Kategorie darüber hat zusätzlich einen Saison-Preis.

Konfiguration (Grundpreis):

EbeneBasis-PreisHauptsaison
Kategorie „Standard"12,00 €20,00 €
Parzelle „A-01"16,00 €(leer)

Auflösung im Juli (Hauptsaison aktiv):

  1. Parzelle → Saison-Preis? Nein
  2. Parzelle → Basis-Preis 16,00 € gefunden → verwenden

Ergebnis Hauptsaison: 16,00 € (Parzellen-Basis-Preis, nicht die 20,00 € der Kategorie)

Auflösung im März (keine Saison aktiv):

  1. Parzelle → Saison-Preis? Es ist keine Saison aktiv
  2. Parzelle → Basis-Preis 16,00 € gefunden → verwenden

Ergebnis außerhalb Saison: 16,00 €

Interpretation: Sobald die Parzelle einen eigenen Preis trägt, ist sie von der Saison-Staffel ihrer Kategorie abgekoppelt – sie kostet ganzjährig 16,00 €. In der Hauptsaison ist sie damit sogar günstiger als eine Parzelle ohne Override (20,00 €).

Möchtest du, dass die Sonderparzelle auch in der Hauptsaison teurer ist, gib ihr explizit einen Hauptsaison-Preis (z.B. 24,00 €). Die Alternative: den Parzellen-Preis wieder entfernen, damit die Kategorie-Staffel greift.

Faustregel: Ein Override auf der Parzelle ist eine Entscheidung „für alle Saisons". Wer Saison-Staffeln nutzen will, pflegt sie auf derselben Ebene mit.


Ohne Grundpreis nicht buchbar ​

Löst sich für eine Parzelle kein Grundpreis auf – weder auf der Parzelle noch auf ihrer Kategorie –, dann ist sie nicht buchbar:

  • Gäste sehen sie nicht mehr in der Buchungsstrecke. Früher erschien sie dort für 0,00 €; das war schlimmer als sie auszublenden.
  • Legst du im Desk eine Buchung darauf an oder änderst eine bestehende darauf, wird das abgelehnt: „Für diese Parzelle ist im gewählten Zeitraum kein Grundpreis hinterlegt …".
  • Dein Dashboard meldet den Fall unter „Handlungsbedarf": „Aktive Parzellen ohne Grundpreis vorhanden — sie sind für Gäste nicht buchbar." Der Beheben-Link führt direkt zu Tarife & Regeln → Preise.

0,00 € ist kein fehlender Preis. Trägst du bewusst 0 ein, bleibt die Parzelle buchbar und kostenlos. Nur eine leere Zelle (–) auf allen Ebenen führt zum Ausschluss.


Einfacher und Fortgeschrittener Modus ​

CampsiteHero bietet zwei Modi für die Preiskonfiguration:

Einfacher Modus (Standard für neue Campingplätze) ​

Im einfachen Modus werden nur Basispreise verwendet. Saisons können zwar angelegt werden (z.B. für Öffnungszeiten), aber saisonale Preisunterschiede werden ignoriert. Das vereinfacht die Preispflege erheblich – du legst einen Preis pro Gästekategorie fest, und fertig.

Wann ist der einfache Modus sinnvoll?

  • Kleine Campingplätze mit einheitlichen Preisen über das ganze Jahr
  • Campingplätze die gerade erst einrichten und später Saisonpreise ergänzen möchten

Fortgeschrittener Modus ​

Im fortgeschrittenen Modus stehen Basis- und Saisonpreise zur Verfügung. Du kannst für jede Saison (Hauptsaison, Nebensaison etc.) unterschiedliche Preise definieren – auf allen drei Ebenen (Campingplatz, Kategorie und Parzelle).

Umschalten ​

  1. Klicke in der Navigation auf Tarife & Regeln → Preise
  2. Schalte den Toggle Saisonabhängige Preise oben rechts im Seitenkopf ein oder aus

Wichtig: Beim Umschalten gehen keine Daten verloren. Bestehende Saisonpreise bleiben in der Datenbank erhalten. Im einfachen Modus werden sie lediglich nicht angezeigt und bei der Preisberechnung ignoriert. Wenn du zurück in den fortgeschrittenen Modus wechselst, sind alle Saisonpreise wieder da.


Preise konfigurieren ​

Campingplatz- und Kategorie-Preise setzen ​

  1. Wechsle zum gewünschten Campingplatz
  2. Klicke in der Navigation auf Tarife & Regeln
  3. Wähle den Abschnitt Preise
  4. Klicke in die gewünschte Zelle und trage den Preis ein – getrennt nach Basis und Saison
  5. Bestätige mit Enter oder indem du das Feld verlässt

Die Personen- und Vehikel-Matrizen haben eine Spalte je Kategorie neben der platzweiten Spalte. Trägst du dort einen Preis ein, gilt er für alle Parzellen dieser Kategorie und überschreibt den platzweiten Wert.

Kategorie-Spalten wirken jetzt wirklich. Vor dem Update (August 2026) wurden dort eingetragene Personen- und Vehikelpreise zwar gespeichert, aber bei der Buchungsberechnung ignoriert – gerechnet wurde mit dem platzweiten Preis. Wenn du die Spalten damals befüllt hast, prüfe deine Preise einmal nach: Sie greifen ab sofort.

Hinweis: Nur Betreiber können Campingplatz- und Kategorie-Preise bearbeiten.

Preise-Seite mit Kategorie-Grundpreisen und Gästepreismatrix

Parzellen-Preise setzen ​

  1. Öffne die gewünschte Parzelle (Klick auf Pill in der Seitenleiste)
  2. Wechsle zum Tab Preise
  3. Trage nur die Preise ein, die du überschreiben möchtest
  4. Bestätige jede Zelle mit Enter oder indem du das Feld verlässt

Leere Zellen zeigen den geerbten Wert kursiv mit einem Vererbungs-Pfeil. Der Tooltip am Pfeil nennt die Quelle – zum Beispiel „Erbt 8,00 € von Kategorie (Standard-Wiesenplatz)". Auf dem Smartphone steht dieser Hinweis als eigene Textzeile unter dem Wert, weil es dort keinen Hover gibt.

Hinweis: Mitarbeiter können Parzellen-Preise bearbeiten. Campingplatz- und Kategorie-Preise sind nur für Betreiber.

Tab „Preise" im Parzellen-Panel von „A1": Grundpreis 30,00 € und Gästekategorie-Preise (Erwachsener 8,00 €, Kind 4,00 € …), geerbte Werte kursiv mit Vererbungs-Pfeil

Preis wieder entfernen ​

Jede Zelle wird sofort gespeichert – es gibt keinen Speichern-Knopf. Zum Entfernen leerst du das Feld und bestätigst mit Enter oder indem du das Feld verlässt. Escape bricht die Bearbeitung ab, ohne etwas zu ändern.

EingabeErgebnis
Feld geleert, die Zelle erbt von keiner höheren EbeneDer Preis wird gelöscht, die Zelle zeigt –
Feld geleert, die Zelle hat einen übergeordneten WertDein eigener Preis wird gelöscht, die Zelle zeigt wieder den geerbten Wert (kursiv)
- (Bindestrich)Dasselbe wie ein geleertes Feld
Feld enthält 0Gültiger Preis 0,00 € – wird gespeichert, nicht gelöscht

ℹ️ – ist nicht dasselbe wie 0,00 €:

  • – bedeutet „für diese Kombination ist kein Preis hinterlegt".
  • 0,00 € bedeutet „kostenlos" – ein bewusst gesetzter Preis.

Das gilt für beide oben beschriebenen Wege und für alle Preisarten der Matrix: Gästekategorie-Preise, Vehikelpreise und Kategorie-Grundpreise.

✅ Ein Vertipper löscht nichts mehr. Ist deine Eingabe nicht lesbar (z.B. abc, € oder 12.50 mit Punkt statt Komma), erscheint eine rote Meldung an der Zelle und die Zelle bleibt zum Korrigieren offen – gespeichert oder gelöscht wird nichts. Dasselbe gilt für negative Beträge. Früher passierte in diesem Fall wortlos gar nichts.

Kategorie-Grundpreise: In der Zeile „Standard-Wiesenplatz" steht die Eingabe „abc" in einem rot umrandeten Feld, darüber die rote Meldung „Das ist kein gültiger Betrag — erwartet wird zum Beispiel 12,50. Zum Entfernen das Feld leer lassen oder „-" eingeben."


Kategorie-Grundpreis ​

Der Kategorie-Grundpreis ist ein Übernachtungspreis, der direkt für eine Kategorie gilt – ohne Gästekategorie- oder Vehikelbezug. Er dient als Basis-Parzellenpreis für alle Parzellen dieser Kategorie.

Wann ist ein Kategorie-Grundpreis sinnvoll?

  • Dein Campingplatz hat mehrere Kategorien mit unterschiedlichen Preisen (z.B. Premium-Kategorie: 18,00 € / Nacht, Standard-Kategorie: 12,00 € / Nacht)
  • Du willst alle Parzellen einer Kategorie einheitlich bepreisen, ohne jeden Parzellen-Preis einzeln setzen zu müssen

Vererbungskette für den Grundpreis:

SchrittWas wird geprüft?Priorität
1Parzelle: Saison-PreisHöchste
2Parzelle: Basis-Preis↕
3Kategorie: Saison-Preis↕
4Kategorie: Basis-PreisNiedrigste

Erst die Parzelle vollständig, dann die Kategorie – „Ebene schlägt Saison".

Preise-Seite mit Kategorie-Grundpreisen pro Kategorie


Tipp: Wo setzt du welche Preise? ​

ZielEmpfohlene Ebene
Einheitliche Personen-/Vehikelpreise für alle ParzellenCampingplatz
Einheitlicher Grundpreis für alle ParzellenKategorie (der Grundpreis hat keine Campingplatz-Ebene)
Alle Parzellen einer Kategorie sollen gleich seinKategorie
Einzelne Sonderparzelle hat abweichenden PreisParzelle
Alles gleich, nur eine Saison überschreibenCampingplatz (Saison-Preis)
Bestimmte Kategorie in Saison teurerKategorie (Saison-Preis)
Bestimmte Parzelle in Saison teurerParzelle (Saison-Preis)

Empfehlung: Setze Preise so weit oben wie möglich und überschreibe nur, wo nötig. Je weniger Overrides, desto einfacher die Pflege – und desto weniger Parzellen sind von den Saison-Staffeln abgekoppelt („Ebene schlägt Saison").


Nächste Schritte ​


Hinweis für Entwickler: Bei Änderungen an der Preisvererbungs-Logik müssen sowohl dieses Dokument als auch die Frontend-Komponente PriceInheritanceInfo.tsx aktualisiert werden. Siehe shared/AGENTS.md → Abschnitt "Synchronisationspflicht".