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

# Event streaming

> Stream events from Hightouch to downstream tools in real time for activation, personalization, and time-sensitive workflows.

## Overview

**Event streaming** sends events collected by Hightouch directly to destinations, without going through the warehouse. Events arrive **in seconds** — useful when timing matters, like triggering a message, updating consent, or powering real-time personalization.

> [!NOTE]
>
> Event streaming is a type of [**Event
> Sync**](https://docs.hightouch.com/syncs/types-and-modes.md#event-syncs) that takes events from an Event
> Source and syncs them to an Event Destination in real-time.

## When to use event streaming

Use event streaming when your workflow depends on **something that just happened**.

Examples:

* **Post-purchase messaging** — send an upsell or confirmation immediately after checkout
* **Real-time ad spend control** — pause ads as soon as they exceed their budget
* **Lifecycle triggers** — follow up right after a demo request, new sign-up, or missed call
* **Consent and contact updates** — sync a user's consent or contact status the moment it changes

### When to use reverse ETL instead

Reverse ETL is a better fit when timing is less critical and **context matters more than immediacy**.

Use reverse ETL when you need:

* **Warehouse-enriched or aggregated data**\
  (joins across tables, LTV, days since last purchase, ML scores)
* **Audiences built from historical behavior**\
  (for example, users who purchased 3+ times in the last 90 days)
* **Ongoing monitoring and governance at scale**\
  (shared models and metrics used across many workflows)

For example, reverse ETL works better for:

* Conversion events that benefit from complete identity and revenue context
* Audience membership that should change over time, not from a single event
* Features or scores computed from many events (churn risk, power users, high-value cohorts)

→ Learn more about [Reverse ETL syncs](https://docs.hightouch.com/syncs/types-and-modes.md).

## How event streaming works

With event streaming, events flow through Hightouch and are forwarded to destinations in near real time.

![Event Streaming Diagram](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/event-source-sync-destination-diagram.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=075a8c6f98a2f11f86f01b37ab90b22f)

At a high level, each streamed event follows this path:

1. The event is received from an **event source** (SDK, HTTP API, streaming source, or webhook).
2. (Optional) **Contracts** validate the event’s structure, naming, and required fields.
3. (Optional) An **Event Function** transforms or enriches the payload.
4. **Filters** decide whether the event should be forwarded for a given event type.
5. **Field mappings** shape event and user data to match the destination schema.
6. The event is delivered to the **destination**, with automatic retries on failures.

![Event Streaming Flow](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/event-sync-components-diagram.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=b89241829e50ff1ee579d5ec3ef11751)

This flow happens **per event**, rather than on a schedule. For warehouse-based, batch processing, use event storage and reverse ETL instead of event streaming.

### Optional validation and transformation

You can optionally add additional controls to this flow:

* **Data contracts**\
  Validate event structure, naming, and required fields before events are delivered.\
  → See [Managing contracts](https://docs.hightouch.com/events/contracts/management.md)

* **Event functions**\
  Modify or enrich events in-flight before they are sent to the destination.\
  → See [Functions overview](https://docs.hightouch.com/events/functions/overview.md)

These steps are optional and are commonly introduced as your event implementation grows.

## Set up event streaming

### Before you begin

Before you begin, make sure you have:

* An **event source** that’s already set up and receiving events
* A **destination** where you want to forward those events

### 1. Create a new event sync

1. Go to **`Event Collection → Event Syncs`**
2. Click **Add sync**

   ![Add event sync](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/events-add-sync.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=5d4eb647b504bf0e0cd80a6b8c5662e5)

### 2. Select an event source

Choose the source that emits the events you want to stream.

![Select event source](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/events-select-source.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=9b7c957bee87c791c3aff49190e879b1)

If you don’t see the expected source, confirm that events are being received:

1. Go to **`Event Collection → Event Sources`**
2. Select the source
3. Open the **Debugger** tab
4. Trigger the event in your app or site and verify it appears in the debugger

### 3. Select an event destination

Event syncs can either **store events** or **forward events**, depending on your use case:

* **Event storage** destinations write events to your warehouse
* **Event forwarding** destinations send events to downstream tools in real time

Select a destination under **Event forwarding**.

![Select event destination](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/events-select-destination.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=a6de520b8fd0ddccc678b042ad2a3d01)

Use the **Docs** link in the UI to review destination-specific requirements.

![Destination docs link](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/events-destination-docs.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=44783047b7de37b1be66bfc0890cd3ae)

### 4. Name and create the sync

Enter a clear, descriptive name for the sync, then create it.

![Finalize sync](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/events-finalize-sync.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=fea025ec1ed9263e2de5aefcdbed27d1)

Once created, you’ll be taken to the sync’s detail page.

## Configure streamed events

Event configuration happens **inside the sync**, not during creation.

**Set in:**\
`Event Collection → Event Syncs → [Select sync] → Configuration`

### Event types

Each destination supports one or more **standard event types** (for example, a purchase event) and **custom event types**.

You can configure **multiple custom event types** per realtime sync. This lets you forward different event categories (for example, `Product Viewed`, `Cart Updated`, and `Wishlist Added`) through a single sync, each with its own field mappings and configuration.

We recommend always configuring at least one **custom event type** so you don’t unintentionally drop events.

![Select event type](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/events-event-types.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=f359b41589bc15b49a3efc6cd086b374)

### Referencing fields

In [**event filters**](#event-filters) and [**field mappings**](#field-mappings), you can reference fields on the event payload to filter on and match to fields in the destination object. Keep in mind:

* Reference nested fields using dot notation, for example `properties.price` or `event`.
* If a destination expects a specific data type, use **Liquid templates** to cast or format values, for example `{{ row['properties'].price | cast : 'number'}}`.
* If a field name contains a period (`.`) or backslash (\`\`), escape it with a backslash.
* You do not need to escape spaces.
* The `event` property refers to the event’s name for track events.
* The `type` property refers to the SDK and API event type (`track`, `identify`, `page`, `screen`, `group`).

Use the **Debugger** in your event source to inspect real payloads while designing filters and mappings.

### Event filters

Event filters determine which incoming events are sent as each event type.

For example, when configuring a purchase event, you might filter for only purchase-related events.

![Event filters](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/event-filter-screenshot.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=5c2d36a15629f88a55042e0cac0eee42)

### Field mappings

Field mappings control **what data is sent to the destination** and **where it appears**.

Mappings are configured per event type and grouped by purpose in the UI.

**Set in:**\
`Event Collection → Event Syncs → [Select sync] → Configuration → [Select event type]`

![Field mappings](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/event-add-mapping.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=0503a49b60e8f241da81347577435c35)

### Map required event fields

This section maps core event data to fields **required by the destination**.

![Required field mapping](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/map-required-fields.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=ef55c67923a979c58fae01a2d1283210)

Required fields (such as items, total, currency, or timestamp) must be mapped before the sync can run successfully. If required fields are missing or mis-typed, the destination may reject events.

### Sync additional user fields (optional)

This section lets you send **user-level data** along with each event, such as email or subscription status.

Use this when:

* The destination updates user profiles based on events
* You want events to enrich user data in real time

![Additional column mapping](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/additional-column-mapping.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=72956e92e95621b66384f18b50e5f4f1)

### Sync custom event fields (optional)

This section controls which **event-specific details** are included beyond required fields.

For custom events, we recommend sending the **entire `properties` object** so downstream tools receive full context.

![Custom event mapping](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/custom-event-mapping.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=23f16ff6e59345d097152e280c8d37cc)

### Choosing source values

When mapping fields or creating filters, you choose **where each value comes from**.

You can use:

* **Field** – Pull a value directly from the event payload (for example, `properties.total`)
* **Static value** – Send the same value for every event
* **Template** – Format or transform values
* **Create an array** – Combine one or more fields into an array

![Mapping methods](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/event-mapping-methods.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=3d29dbd65af6c36bf67b1de0d2fb4fc2)

These options let you adapt your data to match what the destination expects without changing how events are tracked.

### (Advanced) Edit JSON mode

Within a sync's **`Configuration`** tab, you also have the option to modify the underlying sync configuration directly. This mode is intended for **advanced use cases** where the standard UI does not provide enough flexibility.

Use Edit JSON mode when you need to:

* Make bulk or highly repetitive field mappings
* Reference fields or structures not exposed in the UI
* Apply destination-specific configuration that can’t be expressed visually

Most users should configure event streaming using the event filters and field mappings in the UI.

→ See [**Referencing fields**](#referencing-guide).

![Edit JSON mode button](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/edit-json.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=778955ff22f8cf29d4f9ed27717cabfd)

![JSON configuration Modal](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/edit-config.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=3adb71333f1372eae4e2632c0ba91fb0)

## Errors

Each event sync includes built-in visibility and controls:

* **Overview**: event volume and delivery status
* **Errors**: failed and retried events
* **Alerting**: notifications for failures or latency issues

Failed events are retried automatically before being archived.

![Errors and retries](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/event-errors-screenshot.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=890952e0428a99d05183d23a6e61cc8d)

When troubleshooting, check:

* Filters (events may be excluded before mapping)
* Required mappings (missing required fields)
* Destination credentials and rate limits
* Any Event Functions attached to the sync

## Alerting

Alerting helps you proactively monitor event streaming health.

You can configure alerts to notify your team when:

* Event delivery fails or error rates increase
* Retry thresholds are exceeded
* Latency increases beyond acceptable limits

Alerts are optional but recommended for production workflows.

![Alerting tab in events](https://mintcdn.com/hightouch-3c037897/L_vQfA0JQEpeGUUo/images/events/streaming/events-alerting.png?fit=max\&auto=format\&n=L_vQfA0JQEpeGUUo\&q=85\&s=dbc742323454a5111c903b76ba48c1ac)

## Supported destinations

Any destination in the Hightouch catalog that supports **event forwarding** can be used with event streaming. Check each destination’s documentation for:

* Supported event types
* Required fields
* Rate limits and identity requirements
