> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kameleoon.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Ausfuehrungsablauf der Engine

> Verstehen Sie, wie die Kameleoon-Experimentations-Engine funktioniert, einschliesslich einer detaillierten Aufschluesselung der Lade-, Tracking- und Ausfuehrungsphasen.

# Ausfuehrungsablauf der Engine

Erfahren Sie, wie die Experimentations-Engine Experimente laedt, verfolgt und ausfuehrt.

## Ueberblick ueber die Experimentations-Engine

Kameleoon bietet eine Einzelplattform-Optimierungsloesung fuer Web- und Full-Stack-Anwendungsexperimente. Die Plattform unterstuetzt zwei Hauptloesungen:

* **Web Experimentation**: Fuehren Sie A/B-Tests und andere Formen von Experimenten fuer Websites und Webanwendungen durch.
* **Feature Experimentation**: Ermoeglichen Sie Full-Stack-Feature-Flagging und -Experimentation. Kameleoon stellt zudem zusaetzliche APIs und Tools bereit, um Flackern in A/B-Experimenten zu beseitigen, in Ihre bestehenden Tools zu integrieren und Aufgaben zu automatisieren.

### Code-Ablauf: Laden

```mermaid theme={null}
graph TD
    %% Main Flow Nodes
    EntryPoint(["Entry point"])
    JSFile(["Kameleoon.js"])
    
    LoadEngine(["Load the Kameleoon engine"])
    InitEngine(["Initialize the Kameleoon engine"])
    
    EventLoaded("Send the Kameleoon::Loaded event")
    CheckAbort(["Check abort conditions"])
    
    %% Branching Outcomes
    NoCond("No")
    YesCond("Yes")
    
    %% Yes Flow Nodes
    EventAborted("Send the Kameleoon::Aborted event")
    StopExecution("Stop the execution of Kameleoon<br>on the webpage")
    
    %% Side-Car/Optional Nodes
    DetailCmdQueue("Execute the Kameleoon CommandQueue code<br>with the level: IMMEDIATE argument")
    DetailFlicker("Optional: Remove the anti-flicker CSS rule.<br>Store the timestamp of the engine initialize completion step.")
    DetailDefer(["Optional: Defer all campaigns and configurations<br>(goals, segments, and so on) in a second call."])
    
    %% Continuation Placeholder
    NoDown("⬇")

    %% --- Connections ---
    
    %% Main Path
    EntryPoint --> JSFile
    JSFile --> LoadEngine
    LoadEngine --> InitEngine
    InitEngine --> EventLoaded
    EventLoaded --> CheckAbort
    
    %% Conditions
    CheckAbort --> NoCond
    CheckAbort --> YesCond
    
    %% Yes Path
    YesCond --> EventAborted
    EventAborted --> StopExecution
    
    %% No Path
    NoCond --> NoDown
    
    %% Side Actions
    LoadEngine --> DetailCmdQueue
    InitEngine --> DetailFlicker
    
    %% Connect the two Optional blocks
    DetailFlicker --> DetailDefer

    %% --- Styling ---
    classDef default fill:#F2F2FF,stroke:#8A8AC2,stroke-width:1px,color:#111;
    classDef whiteBox fill:#FFFFFF,stroke:#E2E2F2,stroke-width:1px,color:#111;
    classDef borderless fill:none,stroke:none,color:#111;
    
    class EventLoaded,EventAborted,StopExecution,DetailCmdQueue,DetailFlicker,NoCond,YesCond whiteBox;
    class NoDown borderless;
```

Die Kameleoon-Engine fuehrt das `engine.js`-Tag (frueher `kameleoon.js`) aus. Rufen Sie dieses JavaScript-Tag ueber den HTML-Quellcode Ihrer Anwendungsseiten auf.

Am Einstiegspunkt fuehrt die Engine Folgendes aus:

1. **Aktivierung**: Das `engine.js`-Tag ruft ueber `Kameleoon.Analyst.load()` einen Aufruf der Activation API auf.

2. **Ausfuehrung der Befehlswarteschlange**: Nach dem Laden prueft die Engine das [kameleoonQueue-Array](../../apis/activation-api-js/api-reference/command-queue#syntax) und fuehrt Befehle in der Reihenfolge aus, in der Sie sie hinzugefuegt haben. Verwenden Sie dies fuer Code, der ausgefuehrt werden muss, bevor Kameleoon Funktionen instanziiert.

<Note>
  Kameleoon fuehrt nur Funktionen aus, die der Warteschlange mit dem Parameter `IMMEDIATE` hinzugefuegt wurden.
</Note>

3. **Anti-Flicker und globale Variablen**: **Flackern** tritt auf, wenn die Originalseite kurz angezeigt wird, bevor die Variation erscheint. Dieser Effekt kann zu ungenauen Ergebnissen fuehren. Kameleoon verwendet fortschrittliche Techniken, um Flackern zu beseitigen. Wenn Sie Anti-Flicker konfigurieren, laedt das System das Kameleoon-Skript asynchron mit [Anti-Flicker-Code](../implementation-and-deployment/standard-implementation#asynchrones-tag-mit-anti-flicker).

Sobald Kameleoon das Laden beendet hat, speichert die Variable `window.KameleoonEndLoadTime` den Abschlusszeitstempel.

<Note>
  Passen Sie das Timeout mithilfe der Variable `kameleoonLoadingTimeout` im Installations-Snippet an. Wir empfehlen, den Standardwert von 1000 Millisekunden (oder 750 Millisekunden fuer moderne Implementierungen) beizubehalten. Diese Variable legt fest, wie lange das Installations-Tag das Anzeigen der Seite maximal verzoegern darf, waehrend es auf die Anwendungsdatei wartet.
</Note>

4. **Pruefung auf blockierende Gruende**: Bevor die Initialisierung abgeschlossen wird, prueft die Engine die folgenden blockierenden Gruende:

   * **Storage**: Wenn lokaler oder Sitzungsspeicher nicht verfuegbar ist, beendet die Engine den Vorgang und gibt das Ereignis `Kameleoon::Aborted` mit dem Code `STORAGE` zurueck.
   * **Timeout**: Wenn das Laden von `engine.js` mehr als 750 ms dauert und Sie das Projekt so konfiguriert haben, dass Kameleoon fuer die Seite oder den Besuch deaktiviert wird, gibt die Engine `TIMEOUT` zurueck.
   * **Prerender**: Kameleoon erfordert, dass das Dokument bereit ist (`document.visibilityState == "prerender"`). Ist dies nicht der Fall, beendet das Skript den Vorgang und gibt `PRERENDER` zurueck. Es laedt erneut, wenn sich der Sichtbarkeitsstatus aendert.
   * **Custom script**: Wenn ein benutzerdefiniertes Skript die Sitzung abbricht, gibt die Engine `SCRIPT` zurueck.
   * **Parameter**: Wenn die URL `KameleoonDisabled == true` enthaelt, gibt die Engine `PARAMETER` zurueck und beendet den Vorgang.
   * **Disabled**: Wenn Sie das Projekt im Dashboard deaktivieren, gibt die Engine `DISABLED` zurueck. Siehe [diesen Artikel](/user-manual/project-management/manage-your-projects) fuer Details.

<Note>
  Nur ein technischer Account Manager von Kameleoon kann benutzerdefinierte Abbruchskripte konfigurieren.
</Note>

5. **Verzoegerungen**: Die Engine verschiebt Code und Kampagnen bei Bedarf auf einen zweiten Aufruf. In diesem Fall ruft die Engine die Konfiguration und Kampagnen im SYNC-Modus von `https://SITECODE.kameleoon.com/engine-configuration.js` (frueher `kameleoon-configuration.js` genannt) und `https://SITECODE.kameleoon.com/engine-campaigns.js` (frueher `kameleoon-actions.js` genannt) ab.

<Note>
  Nur ein technischer Account Manager von Kameleoon kann die Option zum Verschieben aller Kampagnen konfigurieren. Sie koennen bestimmte Experimente mit dem Tag "DELAYED" verschieben.
</Note>

Wenn keine blockierenden Gruende vorliegen, geht die Engine zur Phase des Besucherdaten-Trackings ueber.

### Code-Ablauf: Tracking

```mermaid theme={null}
graph TD
    %% --- MAIN SPINE ---
    ParseBrowser(["Parse the browser and OS"])
    UnifySession("If the Unify session data across subdomains option is enabled:")
    RetrieveData["Send a message to the Kameleoon iframe to retrieve the data from the main domain's local storage.<br>Otherwise, retrieve it from the current local storage."]
    InitConsent(["Initialize consent management"])
    
    %% MERGED NODE: InitVisitor + its details
    InitVisitor["Initialize the Visitor object<br>---<br>1. Obtain all previous visits from local storage.<br>Optional: If the Real-Time Sync of visits option is enabled, an additional call retrieves visits stored on Kameleoon Data servers.<br><br>2. Generate a visitorCode ID if no existing one is found in the KameleoonVisitorCode cookie or local storage."]
    
    %% MERGED NODE: SendEvents + its detail
    SendEvents["Send events<br>---<br>Optional: Initialize the product recommendation history."]
    
    ExecGlobalScript(["Execute the project global custom script"])
    ExecQueue(["Execute the remaining code in the Kameleoon CommandQueue"])
    EventStarted(["Send the Kameleoon::Started event"])
    
    %% MERGED NODE: WaitDOM
    WaitDOM["Wait for the DOM to be ready.<br>---<br>Optional: If the Enable support for dynamic websites option is enabled, Kameleoon listens for URL changes to reload its engine."]
    
    InitCampaigns(["Initialize campaigns and actions"])
    FlowContinues("⬇")

    %% --- MAIN FLOW CONNECTIONS ---
    ParseBrowser --> UnifySession
    UnifySession --> RetrieveData
    RetrieveData --> InitConsent
    InitConsent --> InitVisitor
    InitVisitor --> SendEvents
    SendEvents --> ExecGlobalScript
    ExecGlobalScript --> ExecQueue
    ExecQueue --> EventStarted
    EventStarted --> WaitDOM
    WaitDOM --> InitCampaigns
    InitCampaigns --> FlowContinues

    %% --- BRANCHES (Now with plenty of room to fan out) ---
    
    %% Event Branches
    PageEvent("Page event<br>---<br>Page URL and title")
    StaticDataEvent("StaticData event<br>---<br>Data about the device, OS, window size, visit number, time since previous visit, timezone, and language")
    ActivityEvent("Activity event<br>---<br>Data about clicks and activity")

    SendEvents --> PageEvent
    SendEvents --> StaticDataEvent
    SendEvents --> ActivityEvent

    %% Campaign Branches
    Adblocker("Check Adblocker<br>---<br>Check if the visitor is using an adblocker, and send an Adblocker event if they are.")
    RunMutObs("Run MutationObserver<br>---<br>Run the optimization MutationObserver to fill all classes of elements and IDs present on the page for querySelector optimization.")
    GeoOpt("Optional: Geolocation / IP<br>---<br>IP: IP request to get the user IP address (https://data.kameleoon.io/ip).<br>Geolocation: Request to get user geolocation (Country, Region, City).")
    LiveUpdateOpt("Optional: Live Update<br>---<br>Load configuration from https://SITECODE.kameleoon.com/live-experiments/config.js.")

    InitCampaigns --> Adblocker
    InitCampaigns --> RunMutObs
    InitCampaigns --> GeoOpt
    InitCampaigns --> LiveUpdateOpt

    %% --- STYLING ---
    classDef default fill:#F2F2FF,stroke:#8A8AC2,stroke-width:1px,color:#111;
    classDef whiteBox fill:#FFFFFF,stroke:#E2E2F2,stroke-width:1px,color:#111;
    classDef detailBox fill:#FFFFFF,stroke:#8A8AC2,stroke-width:2px,color:#111;
    classDef borderless fill:none,stroke:none,color:#111;

    class UnifySession,RetrieveData,PageEvent,StaticDataEvent,ActivityEvent,Adblocker,RunMutObs,GeoOpt,LiveUpdateOpt whiteBox;
    
    %% Detail boxes get a slightly thicker border to denote they contain sub-steps
    class InitVisitor,SendEvents,WaitDOM detailBox;
    class FlowContinues borderless;
```

Nach der Initialisierung ruft Kameleoon Besucherdaten ab:

1. Kameleoon erfasst technische Daten wie den Browser und das Betriebssystem des Besuchers.
2. Wenn Sie [Sitzungsdaten ueber Subdomains vereinheitlichen](../technical-concepts/unify-session-data-storage-across-subdomains) aktivieren, ruft Kameleoon vergangene Daten ueber ein iFrame auf der Hauptdomain des lokalen Speichers ab.
3. Wenn Sie die `Echtzeit-Synchronisation von Besuchen` oder die [`Cross-Device`](../../cross-device-experimentation)-Option aktivieren, ruft die Engine die Nutzungshistorie von den Kameleoon-Servern ab.

<Note>
  Die Echtzeit-Synchronisation ist fuer Kameleoon Feature Experimentation oder fuer Safari standardmaessig aktiv, um die [Auswirkungen von ITP](../technical-concepts/itp-management) zu verwalten.
</Note>

4. Die Engine initialisiert einen Besucher. Wenn im Cookie `kameleoonVisitorCode` oder im lokalen Speicher kein Code vorhanden ist, weist die Engine einen neuen Besuchercode zu und analysiert alle Besuche.
5. Die Engine parst und speichert Daten wie Seiten-URL, Geraet, Betriebssystem, Geolokalisierung und Ziele.

<Note>
  Wenn Sie das Add-on fuer Produktempfehlungen verwenden, instanziiert Kameleoon hier die Empfehlungs-Engine.
</Note>

6. Das globale benutzerdefinierte Skript fuehrt eingefuegtes JavaScript aus, bevor Experimente initialisiert werden.
7. Das globale Experimentskript wird nach dem benutzerdefinierten globalen Skript ausgefuehrt. Dieses Skript wird unabhaengig vom Targeting ausgefuehrt und stoppt, wenn das Experiment pausiert. Siehe [diesen Leitfaden](/user-manual/experimentation/web-experimentation/graphic-based-experiments/getting-started-with-the-graphic-editor#Experiment-specific_custom_script) fuer Details.
8. Die Engine fuehrt ausstehende Befehle aus der `CommandQueue` aus, die den Parameter `IMMEDIATE` nicht verwenden.
9. Das Ereignis `Kameleoon::Started` wird ausgeloest, wenn die Initialisierung abgeschlossen ist, und die Engine speichert die Daten.
10. Wenn Sie die [SPA-Verwaltung](/user-manual/experimentation/web-experimentation/advanced-experiment-types/set-up-experiment-single-page-app) aktivieren, ueberwacht Kameleoon URL-Aenderungen. Wenn sich die URL aendert, laedt die Engine neu, um sicherzustellen, dass die Kampagnen in der neuen Ansicht ordnungsgemaess funktionieren.
11. Bevor die Kampagnen initialisiert werden, fuehrt Kameleoon Folgendes aus:
    * Prueft auf einen Werbeblocker.
    * Fuehrt `mutationObserver` aus, um `querySelector`-Operationen zu optimieren.
    * Ruft Geolokalisierungsdaten von `https://eu-data.kameleoon.io/ip` ab, falls das Segment dies erfordert.
12. Um die Kampagnenkonfiguration zu laden, ruft Kameleoon Daten von `https://SITECODE.kameleoon.com/live-experiments/config.js` ab und speichert sie 2 Minuten lang im Cache.

<Note>
  Die Funktion Live Update Experiments aktualisiert mit `LIVE-UPDATE` markierte Experimente, um Echtzeit-Konfigurationsaenderungen ohne Browser-Caching-Verzoegerungen zu ermoeglichen.
</Note>

### Code-Ablauf: Ausfuehrung

```mermaid theme={null}
graph TD
    %% Main Start Node
    StartNode(["Run all Experiments / Personalizations"])

    %% --- LEFT BRANCH: Holdout Control ---
    %% Check Node
    CheckHoldout(["Check if visitor is in an 'Holdout Control group'"])
    
    %% Outcomes
    OutcomeNo[No]
    OutcomeYes[Yes]

    %% No Flow Nodes
    HoldoutInclusionEvent(["Send holdout inclusion event"])
    IfTargetingTrue(["If targeting is 'true' for the visitor"])
    OptionalDelayedTag(["(Optional) If the campaign has a 'DELAYED' tag"])
    DownloadVariationData["<b>Download variation data</b><br>---<br>https://SITECODE.kameleoon.com/{personalizations/experiments}/$campaign_id/variations/$variation_id.js"]
    SendExpPersEvent(["Send Experiment / Personalization event"])
    
    %% Yes Flow Nodes
    HoldoutExclusionEvent(["Send holdout exclusion event"])

    %% Left Branch Connections
    StartNode --> CheckHoldout
    CheckHoldout --> OutcomeNo
    CheckHoldout --> OutcomeYes
    OutcomeNo --> HoldoutInclusionEvent
    HoldoutInclusionEvent --> IfTargetingTrue
    IfTargetingTrue --> OptionalDelayedTag
    OptionalDelayedTag --> DownloadVariationData
    DownloadVariationData --> SendExpPersEvent
    OutcomeYes --> HoldoutExclusionEvent

    %% --- RIGHT BRANCH: Targeting and Goals ---
    %% Split Point Node
    RunTargetingSegments(["Run all Targeting Segments"])
    
    %% Splitting Nodes
    %% Flow 1: Targeting Event
    IfSegmentConditions(["If the segment conditions are met for the visitor"])
    SendTargetingEvent(["Send Targeting event"])
    
    %% Flow 2: Goal Flow
    OptionalAIOpportunity(["(Optional) If the AI Opportunity Detection add-on is enabled"])
    DownloadOpportunitySegment["<b>Download opportunity segment and execute them</b><br>---<br>https://SITECODE.kameleoon.com/audiences/segments.js"]
    RunAllGoals(["Run all goals"])
    IfGoalConverted(["If the goal is converted for the visitor"])
    SendGoalEvent(["Send Goal event"])

    %% Right Branch Connections
    StartNode --> RunTargetingSegments
    
    %% Flow 1 Connections
    RunTargetingSegments --> IfSegmentConditions
    IfSegmentConditions --> SendTargetingEvent
    
    %% Flow 2 Connections
    RunTargetingSegments --> OptionalAIOpportunity
    OptionalAIOpportunity --> DownloadOpportunitySegment
    DownloadOpportunitySegment --> RunAllGoals
    RunAllGoals --> IfGoalConverted
    IfGoalConverted --> SendGoalEvent

    %% --- STYLING ---
    classDef mainStep fill:#F2F2FF,stroke:#8A8AC2,stroke-width:1px,rx:10,ry:10,color:#111;
    classDef whiteBox fill:#FFFFFF,stroke:#E2E2F2,stroke-width:1px,color:#111;
    classDef conditionalPill fill:#D0D0FF,stroke:#8A8AC2,stroke-width:1.5px,rx:10,ry:10,color:#111;
    classDef outcome fill:#ffffff,stroke:#8A8AC2,stroke-width:1px,rx:5,ry:5,color:#111;

    class StartNode,CheckHoldout,HoldoutInclusionEvent,HoldoutExclusionEvent,SendExpPersEvent,RunTargetingSegments,SendTargetingEvent,RunAllGoals,SendGoalEvent mainStep;
    class DownloadVariationData,DownloadOpportunitySegment whiteBox;
    class IfTargetingTrue,OptionalDelayedTag,IfSegmentConditions,OptionalAIOpportunity,IfGoalConverted conditionalPill;
    class OutcomeNo,OutcomeYes outcome;
```

Wenn die Experimentations-Schleife ausgefuehrt wird, geht die Engine wie folgt vor:

1. Wenn der Besucher Teil einer "Holdout"-Gruppe ist, sendet die Engine ein Holdout-Einschlussereignis.
2. Die Engine loest ein Expositionsereignis aus, das eine `nonce`, eine `experimentID` und eine `variationId` enthaelt. Beispiel: `eventType=experiment&nonce=5800F1BDD0667747&id=250830&variationId=978588`.
3. Wenn der Besucher nicht in einer Holdout-Gruppe ist, sendet die Engine ein "Holdout-Ausschlussereignis".

<Note>
  Holdout-Experimente ermoeglichen es Ihnen, andere Experimente zu verwalten und zu blockieren:

  * Die Engine prueft zuerst auf Holdout-Experimente.
  * Wenn sich ein Nutzer in einer Holdout-Gruppe befindet, weist die Engine ihn einer Gruppe zu und sendet ein Ereignis zum Reporting.
  * Wenn sich der Nutzer in der Referenzgruppe befindet, blockiert die Engine alle anderen Experimente.
  * Wenn sich der Nutzer in der Variationsgruppe befindet, erlaubt die Engine, dass andere Experimente fortgesetzt werden.

  Erfahren Sie mehr im [Leitfaden zur Holdout-Verwaltung](/user-manual/experiment-analytics/analyze-results/advanced-analysis/create-and-manage-holdouts).
</Note>

Die Engine startet dann die Datenerhebung. Wenn eine Personalisierung ausgeloest wird, aber nicht angezeigt wird, gibt die Engine einen der folgenden blockierenden Gruende zurueck:

* **PERSONALIZATION\_CAPPING**: Die Personalisierung hat ihr globales Besucherlimit erreicht.
* **SCHEDULE**: Die Personalisierung ist aufgrund ihres Zeitplans deaktiviert.
* **SCENARIO**: Einige Szenariobedingungen sind nicht erfuellt.
* **PRIORITY**: Es existiert eine Personalisierung mit hoeherer Prioritaet.
* **VISITOR\_CAPPING**: Der Besucher hat ein Limit erreicht, das die Anzeige verhindert.

Wenn Sie einem Experiment einen `DELAYED`-Tag zuordnen, loest die Engine es nach dem ersten Seitenladevorgang aus. Die Engine laedt Variationsdaten von `https://SITECODE.kameleoon.com/(personalizations)/$campaign_id/variations/$variation_id.js` herunter.

<Note>
  Das Verzoegern eines Experiments ist nuetzlich fuer Popups oder Aenderungen unterhalb des sichtbaren Bereichs, bei denen das Flackern minimal ist.
</Note>

Fuer das Add-on AI Opportunity Detection laedt Kameleoon Segmentdefinitionen von `https://SITECODE.kameleoon.com/audiences/segments.js` herunter, um Gelegenheiten zu erkennen.

<Note>
  Kameleoon prueft Segmente, die in den letzten 90 Tagen erstellt oder geaendert wurden, mit Ausnahme jener, die mit `[DEV]`, `[TEST]` oder `[QA]` beginnen.
</Note>

Analysieren Sie diese Informationen auf der Ergebnisseite, um Konversionsraten und potenzielles Umsatzwachstum zu verfolgen.
