> For the complete documentation index, see [llms.txt](https://asperazera.gitbook.io/ultimate-event-system/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://asperazera.gitbook.io/ultimate-event-system/advanced/tag-hierarchy.md).

# Tag Hierarchy & Filtering

UES uses Unreal's **Gameplay Tags** as event topics, and Gameplay Tags are **hierarchical** - they read like folders separated by dots:

```
Event.Player.Death
Event.Player.HealthChanged
Event.Player            ← parent
Event                   ← grandparent
```

By default an event only reaches subscribers of the **exact** tag. But you can also let it travel *up* the hierarchy so parent subscribers hear it too.

***

### Exact vs. Parent Propagation

The **Send Event** node has a **Trigger Parent Tags** checkbox:

| Trigger Parent Tags   | Who receives Event.Player.Death                                             |
| --------------------- | --------------------------------------------------------------------------- |
| **`False`** (default) | Only subscribers of `Event.Player.Death`.                                   |
| **`True`**            | Subscribers of `Event.Player.Death` **and** `Event.Player` **and** `Event`. |

<figure><img src="/files/137Y78usziHpCuOAJu5Z" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
**The original tag is preserved.** When a parent subscriber receives a propagated event, its callback's **Event** pin still carries the exact leaf tag that fired (`Event.Player.Death`), so you always know what really happened.
{% endhint %}

***

### Great Use Cases

#### 1. Central Logger / Analytics

Have one manager **Subscribe** to the parent tag `Event`, and send your gameplay events with **Trigger Parent Tags = True**. That single subscriber now captures every child event in the game - no per-event wiring.

#### 2. Grouped HUD Subscriber

A HUD widget subscribes to `UI.HUD`. Any specific event (`UI.HUD.HealthChanged`, `UI.HUD.ScoreChanged`, …) sent with parent propagation reaches the widget, which reads the incoming **Event** tag and updates the right element.

<figure><img src="/files/LQckWHW7AWSyrcHTN7Yy" alt=""><figcaption></figcaption></figure>

***

### Dynamic Tags from Strings

Need to build a tag at runtime (from a save file or config)? Use the **String To Gameplay Tag** node (**UES → Utilities**). It turns a `String` into a `Gameplay Tag` and can even create a temporary tag on the fly if it isn't registered.

<figure><img src="/files/qr8WXmnnkC326XDxTGtH" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
**Parent routing needs registered tags.** A tag created from a raw string is matched by its exact name only and has **no parents** in your project's tag tree - so **Trigger Parent Tags** does nothing for it. For parent propagation to work, register the tag path in **Project Settings → Project → Gameplay Tags**.
{% endhint %}

{% hint style="info" %}
**Reminder:** The `Events` pin on **Subscribe** / **Unsubscribe** is a *Gameplay Tag Container*. You can drag a single `Gameplay Tag` onto it and the editor adds a `->` converter automatically; for several tags, build a container with **Make GameplayTagContainer from Array**.
{% endhint %}
