The events log
Filter, inspect and export the raw event stream, and share any view as a link.
The events log (/projects/:id/events) is the raw record. Where the Pulse aggregates, this page shows you individual events and lets you dig until you find the one that explains the number.
Every filter lives in the URL query string. That means any view you build is a link you can bookmark, or paste to someone else and know they’ll see exactly what you saw.
Toolbar, row 1
Range — Today · 7d · 30d · 90d · Custom. The default is 7d. Choosing Custom reveals two date inputs. Custom ranges snap to UTC day boundaries and are capped at 12 months.
Event dropdown — “All events” plus the top 20 event names, each with its count.
User or visitor id — matches against user_id OR visitor_id. This is deliberate: the same person appears as a visitor id before they identify and a user id after, so one field finds them either way.
Path prefix — narrows to paths starting with what you type.
Changing any filter resets paging back to the newest page.
Toolbar, row 2
- Go live / Live — toggles the live tail. A green dot means it’s streaming.
- Patterns — toggles the patterns panel.
- CSV — exports the current page.
- Saved views — a dropdown of your saved queries, plus a ☆ button to save the current one.
- Local / UTC — the same display toggle as the Pulse, shared across pages via localStorage.
Volume histogram
One bar per bucket — hour for today, day otherwise. Hover a bar for its count and day.
Drag across bars to zoom into that slice. The drag converts your selection into a Custom range, so you can go from “there’s a spike Tuesday” to “here are those events” in one gesture.
Drag-zoom is disabled on today, because hour buckets can’t be mapped onto day-snapped custom ranges.
Patterns panel
Toggle “Patterns” to open Event patterns — the top 50, computed server-side in SQL across your entire selected range. This matters: it is not a client-side tally of the rows currently on screen, so the counts reflect all your data, not a recent sample.
Pageviews are grouped by a normalized path template. The normalizer replaces UUIDs with {UUID}, hex runs of 16 or more characters with {HEX}, and digit runs with {NUM}, then collapses adjacent duplicate placeholders. So /orders/1042/items/7 becomes /orders/{NUM}/items/{NUM}. Custom events group by name.
Columns:
| Column | What it shows |
|---|---|
| Pattern | The normalized path template, or the event name |
| Count | Events matching the pattern |
| % of total | Share of events in range; under 1% shows as <1 |
| Bar | The green segment is the share of events from identified users |
| People | Distinct actor count |
That green segment is the quick read on whether a pattern is your logged-in product or your public marketing surface.
Clicking a pattern filters the log to it. For a pageview template, it sets event=$pageview plus a path prefix up to the first placeholder.
Live tail
The strip is labeled “Live tail — sampled at ≥5 events/s”, and the label is literal.
The collector coalesces publishing to at most 5 events per second per project, and it drops events when a subscriber’s channel is full. So the live tail is explicitly a sample, not a complete feed. On a busy project you will not see every event go by, by design — it’s a pulse check, not a ledger.
When you need completeness, use the log table itself. It queries stored data and shows you everything that matched.
The tail retains a maximum of 50 rows client-side.
The log table
Columns: Time · Event · Who · Path · Source, with separator rows between days.
$pageview renders muted so custom events stand out. Event names ending in _created render green. On mobile the table collapses to 3 columns.
Expanding a row
Click any row to expand it. You get a detail grid of every non-empty column on that event, plus each custom property rendered as props.<key>.
Two buttons:
- Copy JSON — the whole row, pretty-printed, for pasting into an issue or a message.
- View session — filters the log to that session id and shows a removable “Session:
<id>” chip. This is how you reconstruct one person’s visit end to end: find the interesting event, then read everything around it in order.
Paging
100 rows per page, using keyset pagination ordered by time descending. “Older →” appears whenever the page is full. ”← Newest” returns you to the start.
Keyset paging means results stay stable as new events arrive — you won’t see rows shift between pages the way offset paging does.
CSV export
The CSV button exports the current page only — up to 100 rows. It includes the union of all columns present on that page. The file is named launchpulse-events-YYYY-MM-DD.csv.
If you need more than a page, narrow your filters or step through pages and export each one.
Saved views
Saving a view stores a named snapshot of the current query string. Views are kept in your browser’s localStorage, per project.
That means they are per-browser and not synced across devices or shared with your teammates. If you want a colleague to have a view, copy the URL and send it — the URL carries the whole query.
Re-saving with a name that already exists overwrites that view.
Why columns differ between projects
The analytics store drops columns that are entirely empty for a project. So the row detail grid and the CSV export show different columns depending on what your site actually sends.
If a field you expect is missing, it’s because no event in that project has ever carried a value for it. Send it once and the column appears. See the data model for the full field list, and tracking events for how to send custom properties.
Where to go next
- The Pulse dashboard — the aggregate view these events roll up into
- Tracking events — send custom events and properties
- Identifying users — turn visitor ids into user ids
- Troubleshooting — when events aren’t showing up