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

# Flows-Referenz

> Trigger-Ereignisse, verfügbare Aktionen und Template-Variablen für SquadVault Flows.

Referenz zum Bauen und Debuggen von Flows. Die Produkt-Einführung findest du unter [Flows](/de/user-guide/flows).

## Trigger

Workflows reagieren auf einen Ereignistyp oder laufen **nach Zeitplan** (gespeichert als Cron mit fünf Feldern + Zeitzone). Optionale Bedingungen filtern auf Payload-Felder (zum Beispiel `event.type` gleich `scrim`).

### Zeitplan

| Ereignis         | Löst aus, wenn                         | Häufige Variablen                                        |
| ---------------- | -------------------------------------- | -------------------------------------------------------- |
| `schedule.fired` | Der Cron-Zeitplan des Flows ist fällig | `schedule.cron`, `schedule.timezone`, `schedule.firedAt` |

Im Builder wählst du **Nach Zeitplan**, ein Preset (oder erweiterten Cron) und aktivierst den Flow.

### Teams und Spieler

| Ereignis             | Löst aus, wenn                                 | Häufige Variablen                                                               |
| -------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------- |
| `team.created`       | Ein Team erstellt wird                         | `team.*` inkl. Discord-Felder (meist leer, bis verknüpft)                       |
| `team.updated`       | Team-Felder sich ändern                        | `team.*` inkl. Discord-Rolle/-Kanal                                             |
| `team.deleted`       | Ein Team gelöscht wird                         | `team.*` inkl. Discord-Rolle/-Kanal                                             |
| `player.created`     | Ein Spieler erstellt wird                      | `player.id`, `player.name`, `player.discordUserId`, `player.nationality`        |
| `player.archived`    | Ein Spieler archiviert wird                    | `player.id`, `player.name`, `player.nationality`                                |
| `player.joined_team` | Ein Spieler einem Team-Roster hinzugefügt wird | `player.*` (inkl. `nationality`), `team.*` (inkl. Discord-Rolle/-Kanal), `role` |
| `player.left_team`   | Ein Spieler aus einem Team entfernt wird       | `player.*` (inkl. `nationality`), `team.*` (inkl. Discord-Rolle/-Kanal)         |
| `captain.assigned`   | Die Roster-Rolle auf Captain wechselt          | `player.*` (inkl. `nationality`), `team.*` (inkl. Discord-Rolle/-Kanal)         |
| `coach.assigned`     | Die Roster-Rolle auf Coach wechselt            | `player.*` (inkl. `nationality`), `team.*` (inkl. Discord-Rolle/-Kanal)         |

### Kalender und Verfügbarkeit

| Ereignis               | Löst aus, wenn                            | Häufige Variablen                                |
| ---------------------- | ----------------------------------------- | ------------------------------------------------ |
| `event.created`        | Ein Kalendertermin erstellt wird          | `event.*`, optional `team.*` mit Discord-Feldern |
| `event.updated`        | Ein Kalendertermin aktualisiert wird      | dieselben                                        |
| `event.deleted`        | Ein Kalendertermin gelöscht wird          | `event.id`, `event.title`, optional `team.*`     |
| `availability.updated` | Eine Spieler-Rückmeldung gespeichert wird | `player.id`, `player.name`                       |

### Aufgaben, Dokumente, Tryouts, Organisation

| Ereignis                | Löst aus, wenn                                                                | Häufige Variablen                                                |
| ----------------------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| `task.created`          | Eine Aufgabe erstellt wird                                                    | `task.id`, `task.title`                                          |
| `task.completed`        | Der Aufgabenstatus auf erledigt wechselt                                      | `task.id`, `task.title`                                          |
| `document.uploaded`     | Ein Dokument erstellt wird                                                    | `document.id`, `document.name`                                   |
| `tryout.created`        | Eine öffentliche Bewerbung eingeht                                            | `tryout.*`, `player.name`, `team.*` (Discord, wenn Team bekannt) |
| `tryout.accepted`       | Eine Bewerbung angenommen / umgewandelt wird (inkl. Discord-Sync Auto-Accept) | dieselben                                                        |
| `tryout.declined`       | Eine Bewerbung abgelehnt wird                                                 | dieselben                                                        |
| `tryout.status_changed` | Der Bewerbungsstatus sich ändert (jeder Status)                               | dieselben + `tryout.previousStatus`                              |
| `organization.created`  | Eine Organisation erstellt wird                                               | `organization.id`, `organization.name`                           |
| `organization.updated`  | Eine Organisation aktualisiert wird                                           | dieselben                                                        |

<Note>
  `tryout.declined` wird ausgelöst, wenn eine Bewerbung abgelehnt wird.
  `tryout.status_changed` löst bei jedem Statuswechsel aus (auch reviewing und shortlisted).
  Filtere mit einer Bedingung auf `tryout.result` (neuer Status), wenn du nur ein Ergebnis willst.
  Bei Annahme und Ablehnung werden zusätzlich `tryout.accepted` / `tryout.declined` ausgelöst.
</Note>

## Bedingungen

Jede Bedingung besteht aus Feld, Operator und Wert. Zu den Operatoren gehören Gleichheit, Listen (`in`) und Existenzprüfungen. Lass die Bedingungen leer, damit der Flow bei jedem passenden Trigger läuft.

## Aktionen

Aktionen laufen in der angegebenen Reihenfolge (nullbasierte Schritt-Indizes in Templates: `steps.0`, `steps.1`, …).

### Discord

Setzt einen verbundenen Discord-Server voraus. Siehe [Discord](/de/user-guide/discord).

| Aktion                                        | Hinweise                                                                                                                                                                                                                               |
| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `discord.create_role`                         | Optionale Farbe, Server-Rechte (`none` / `basic` / Bitfield), Team-Verknüpfung. Outputs: `roleId`, `roleName`.                                                                                                                         |
| `discord.edit_role`                           | Name, Farbe und/oder Rechte anhand der Rollen-ID aktualisieren                                                                                                                                                                         |
| `discord.delete_role`                         | Anhand der Rollen-ID                                                                                                                                                                                                                   |
| `discord.create_category`                     | Gibt `categoryId` zurück. Optional `privateForRoleId` (@everyone sperren, Rolle erlauben).                                                                                                                                             |
| `discord.create_text_channel`                 | Optionales Parent; `privateForRoleId`; kann als Team-Kanal verknüpft werden                                                                                                                                                            |
| `discord.create_voice_channel`                | Optionales Parent; `privateForRoleId`                                                                                                                                                                                                  |
| `discord.set_channel_permissions`             | Gilt für **Kategorien und Channels**. `makePrivate` für eine Rolle, oder `allow` / `deny` (`team`, `view`, `none` oder Bitfield). Nutze `{{steps.N.categoryId}}` / `{{steps.N.channelId}}` und `{{steps.N.roleId}}`.                   |
| `discord.assign_role` / `discord.remove_role` | Benötigt Discord-Benutzer-ID + Rollen-ID                                                                                                                                                                                               |
| `discord.assign_team_role`                    | Vergibt eine Rolle an alle Roster-Spieler mit Discord-Link. `teamId` defaultet auf das Trigger-Team; ohne `roleId` wird die verknüpfte Team-Rolle genutzt. Outputs: `assignedCount`, `skippedCount`, `failedCount`, `discordMentions`. |
| `discord.send_message`                        | Kanal-ID oder Org-Log-Kanal. Reiner `content` und/oder ein einzelnes `embed` (`title`, `description`, `color` als Hex wie `#a162ff`, `footer`, `fields`). `content` ist optional, wenn ein `embed` gesetzt ist.                        |

### SquadVault

| Aktion                         | Hinweise                                                           |
| ------------------------------ | ------------------------------------------------------------------ |
| `squadvault.send_notification` | In-App-Benachrichtigung (Workflow, Titel, Text, optional Benutzer) |
| `squadvault.get_team`          | Lädt Team + Discord-Verknüpfungen in die Schritt-Ausgaben          |
| `squadvault.get_team_players`  | Roster + `discordMentions`-String für Pings                        |
| `squadvault.get_player`        | Einzelner Spieler-Lookup                                           |
| `squadvault.get_member`        | Lookup für Org-Mitglied / Benutzer                                 |

### Kommunikation

| Aktion                  | Hinweise                                                                                                                    |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `communication.webhook` | Einmaliger signierter POST an eine URL (optional Secret). Für dauerhafte Org-Events nutze [Webhooks](/user-guide/webhooks). |

## Lookup-Ausgaben

### Get team (`squadvault.get_team`)

Konfiguration: `teamId` (standardmäßig aus `{{team.id}}`, wenn vorhanden).

Zu den Ausgaben gehören: `id`, `name`, `description`, `game`, `image`, `discordRoleId`, `discordRoleMention`, `teamChannelId`.

### Get team players (`squadvault.get_team_players`)

Konfiguration: `teamId`, optional `includeArchived`.

| Ausgabe           | Beschreibung                                                         |
| ----------------- | -------------------------------------------------------------------- |
| `count`           | Anzahl der zurückgegebenen Spieler                                   |
| `names`           | Anzeigenamen, durch Komma getrennt                                   |
| `discordUserIds`  | Discord-IDs, durch Komma getrennt                                    |
| `discordMentions` | Durch Leerzeichen getrennte `<@id>`-Mentions für Discord-Nachrichten |
| `players`         | Vollständiges Array (Code / fortgeschrittene Nutzung)                |

### Get player / Get member

* **Get player** – `discordMention`, `discordUserId`, `userId`, `nationality`, …
* **Get member** – `userId`, `name`, `email`, `role`, … (bei leerer User-ID wird ggf. auf den Auslöser des Ereignisses zurückgegriffen)

## Aufbau im Code-Modus

```json theme={null}
{
  "triggerEventType": "team.created",
  "conditions": [],
  "actions": [
    {
      "provider": "discord",
      "actionType": "discord.create_role",
      "config": {
        "name": "{{team.name}}",
        "permissions": "none",
        "linkToTeam": true
      }
    },
    {
      "provider": "discord",
      "actionType": "discord.create_category",
      "config": {
        "name": "{{team.name}}",
        "privateForRoleId": "{{steps.0.roleId}}"
      }
    },
    {
      "provider": "discord",
      "actionType": "discord.create_text_channel",
      "config": {
        "name": "{{team.name|slug}}-general",
        "parentId": "{{steps.1.categoryId}}",
        "privateForRoleId": "{{steps.0.roleId}}"
      }
    }
  ]
}
```

## Verwandte Themen

* [Flows](/de/user-guide/flows) – Builder, Vorlagen, Ausführungen
* [Discord](/de/user-guide/discord) – Bot-Verbindung und Synchronisierung
* [Teams und Spieler](/de/user-guide/teams-and-players) – Roster-Änderungen, die Beitritts-/Austritts-Ereignisse auslösen
