> 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/payloads.md).

# Working with Payloads

Most events carry data - a score, a damage amount, a quest struct, an item reference. UES sends this **Payload** without any hard references between your Blueprints.

In Blueprints the whole thing is plug-and-play: **wire your variable into the Payload pin to send, and use the Get Payload node to read it back.** No manual boxing or casting.

***

### What Can You Send?

Wire any of these straight into the **Payload** pin of **Send Event**:

* **Primitives:** `Integer`, `Integer64`, `Float / Double`, `Boolean`, `Byte / Enum`, `String`, `Name`, `Text`.
* **Object references:** any `Object` or `Actor` reference (and Class references).
* **Structures:** any Blueprint or engine struct (`Vector`, `Transform`, your custom `S_...` struct, etc.).
* **Arrays** of any supported type.
* **Sets and Maps**, on newer engines only - `Set` needs **UE 5.6 or newer**, `Map` needs **UE 5.8 or newer**.
* **Soft references:** `Soft Object` / `Soft Class` (the asset path is kept as-is, without loading the asset).

{% hint style="info" %}
**On an older engine?** Below the versions above, the editor won't let you connect a `Set` or `Map` to the **Payload** pin and will tell you so. Wrap the container inside a struct and send the struct instead - that works on every version.
{% endhint %}

***

### Step 1: Send the Data

On the **Send Event** node, drag your variable directly onto the **Payload** pin.

* Wire an `Integer`, `Float`, `Object`, etc. → UES wraps it for you, invisibly.<br>

  <figure><img src="/files/m35NeqrVG3MQ8gWPVdsp" alt=""><figcaption></figcaption></figure>
* Wire a custom struct (e.g. `S_DamageInfo`) → it is packed as that struct.<br>

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

***

### Step 2: Read the Data with **Get Payload**

Inside your Custom Event callback, the data arrives on the **Payload** pin. Unpack it with the **Get Payload** node (category **UES → Utilities**).

1. Drag off the **Payload** pin from your callback and search for **Get Payload**.
2. Drag off the node's **Value** pin (grey/wildcard) and connect it to the type you expect - a variable, a `Break` node, etc. The pin instantly takes that type's color.
3. Use the **Success** boolean to branch: it returns `True` only if the payload actually held that type.

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

{% hint style="success" %}
**Type-safe by design:** if the payload holds a different type than the one you asked for, **Get Payload** leaves your value at its default, returns `Success = False`, and reports a clear message (e.g. *"Expected Integer, but event payload contains 'String'"*) so you can fix it fast.
{% endhint %}

***

### Empty (Signal-Only) Events

If you leave the **Payload** pin empty on **Send Event**, the event is a pure signal. On the receiving side you can simply ignore the `Payload` pin.

***

### When One Tag Carries Different Types

If the same event tag can arrive with different kinds of data, don't chain a pile of Get Payload checks - use the dedicated [Switch on Payload Type](/ultimate-event-system/advanced/switch-on-payload.md) node instead.

{% hint style="info" %}
**Tip:** Need to branch *before* unpacking? The **Get Payload Type** node (**UES → Utilities**) returns a rough category (`Integer`, `Struct`, `Object`, `Container`, `None`, …) you can `Switch` on.
{% endhint %}
