Lens

Echo Events Table

Build a Lens table from your own real-time Echo server-side events. Echo writes events as JSONL to S3 via Firehose, and Lens reads them on a schedule into ClickHouse.

Overview

An Echo Events table is the fastest way to get your first-party server-side data into Lens. Echo already captures events on the server, normalizes them, and drops them as newline-delimited JSON into an S3 path keyed to your company and property. The Lens table reads that path on a schedule, so the same events powering your destinations also power your boards and reports.

Only one Echo Events table is allowed per property, because all of a property's Echo events share a single S3 prefix. If a table already exists for the property, the option to create another is greyed out. Edit the existing table rather than trying to add a second one.

Add and name the table

Open Lens > Tables, click + New Table, and choose Echo Events under Data Sources. Give it a Table Name like Website Events or Order Events. The S3 Path field is read-only and is auto-constructed as lens/echo/<company>/<property>/. You do not pick a bucket or prefix; Echo's Firehose delivery already writes there.

Sync Mode is fixed to Incremental and cannot be changed. Echo events are always appended. Each sync reads only files newer than the last run, which keeps syncs fast and avoids re-importing the entire history every time.

Inject dimensions and filters

Use Inject Dimensions to write fixed key-value pairs onto every row during sync. This is for labeling, such as stamping a channel name, source platform, or region that is not part of the event itself. The value is constant across all rows; it does not transform existing fields.

Use Filters to keep only the events you care about. Every filter must match for a row to be included, so filters combine with AND logic. This is handy when one property emits multiple event types and a table only needs one of them.

Scan and map columns

Open Column Mapping and click Scan Fields. Lens reads a sample of recent events and lists the fields it found, and you pick which ones become columns. If a field you expect is missing, click + Add Custom Field to add it by name.

A field only appears in the scan if it is emitted by the Echo to Lens mapping. The transformer outputs only mapped fields, so a per-customer custom field that isn't in the mapping shows up blank. If a column is empty when you expected data, the fix is almost always in the Echo to Lens mapping rather than in the Lens table.

Save and sync

Pick a sync schedule, then click Save and Sync. The first sync pulls the existing JSONL files, and later runs append only new events. From there the schedule keeps the table current.

Tip

Pair an Echo Events table with a Union table to layer your real-time server-side data on top of slower GA4 backfills. The union deduplicates by date so the freshest source wins for recent days.

Heads up

Changing the table's dimensions or metrics wipes the stored data and resets the incremental cursor. Because Echo is incremental, the next sync then skips files older than the cursor, so history can be lost. Only change columns when you are prepared to re-pull, and check the wipe warning before saving.

Troubleshooting

A column is always blank

The field is not being emitted by the Echo to Lens mapping. The Lens scan can only surface mapped fields. Add the field to the Echo to Lens mapping (per-customer custom fields live in the Lens destination's mapping, not in the system default), then re-scan and re-sync.

The Echo Events option is greyed out

An Echo Events table already exists for this property. Only one is allowed per property because they share a single S3 prefix. Edit the existing table instead of creating a new one.

Old events disappeared after a column change

Changing dimensions or metrics clears stored data and resets the incremental cursor, so older files get skipped on the next run. Recovering the full history requires re-pulling from source. Avoid column changes on a long-lived Echo table unless you intend to rebuild it.