Finding Sessions To Watch
PostHogOfficialPublished by PostHog
- Skill
- Workflow
- Data and AI
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill guides users from broad, undefined goals to a specific, actionable list of session recordings. It prevents the common pitfall of dumping unfiltered data by applying goal-based filters, sorting by activity or error signals, and presenting a curated shortlist. It integrates with data schema discovery and SQL queries to ensure filters are accurate before fetching recordings, ultimately handing off to deep-dive analysis.
What it does
- Translates vague user requests into structured session recording queries.
- Validates event names and properties to ensure filter accuracy.
- Executes multi-step queries to find sessions containing specific events.
- Filters out internal test accounts to improve signal quality.
- Curates a shortlist of the most relevant recordings for the user.
- Provides deep links to specific sessions for immediate investigation.
When to use it
- When a user wants to watch recordings but does not know where to start.
- When a user has a goal like investigating signups, pricing, or onboarding friction.
- When a user wants to find sessions related to specific behaviors like rageclicks or errors.
- When a user needs to find sessions for a specific user segment or feature usage.
Advantages
- Reduces noise by providing a high-signal, curated list instead of raw data.
- Ensures query accuracy by verifying event and property existence first.
- Supports complex goal-based filtering through a two-step SQL and metadata approach.
- Saves time by prioritizing sessions with high activity or error counts.
Usage examples
- “Why are people bouncing on our pricing page? Show me some sessions.”
- The agent verifies the pricing page path, queries for sessions visiting that page, sorts by activity score, and returns a shortlist of the most relevant recordings.
- “I want to see if users are having trouble with our new checkout feature.”
- The agent identifies the checkout event, uses SQL to find sessions containing that event, and presents a list of recordings for the user to review.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/posthog/finding-sessions-to-watch/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip finding-sessions-to-watch.zip -d .agents/skills
Documentation by PostHog
Finding sessions to watch
Most people open session replay with a goal ("why are signups dropping?") but no idea which of thousands of recordings to watch. A raw, unfiltered list is the worst possible answer — it buries the useful sessions in noise. Your job is to turn their intent into a focused filter, return a handful of high-signal recordings, and offer to dig into one.
The starting points below are the same ones the product surfaces as "filter templates" — they encode the jobs people actually use replay for. Treat them as a menu, not a script.
The one rule
Never dump an unfiltered recording list. Always either (a) apply a goal-based filter, or (b) sort by a signal (activity, errors) so the first few rows are worth a click. If the user's goal is unclear, ask one short question or offer the menu before querying.
Available tools
| Tool | Purpose |
|---|---|
posthog:query-session-recordings-list | Find/filter recordings (the workhorse). Returns metadata + id per row. |
posthog:read-data-schema | Confirm real event names, URLs, and property values before filtering. |
posthog:execute-sql | Collect $session_ids for sessions where a specific event happened. |
posthog:cohorts-list | Resolve a cohort name → id when scoping to a user segment. |
posthog:session-recording-playlist-create | Save the resulting filter as a saved filter view (type: 'filters'). |
Hand off to the investigating-replay skill once the user picks a recording to understand in depth.
Workflow
1. Pin down the goal
Map the request to one of the starting points below. If it's vague ("show me something interesting"), offer 3-4 options rather than guessing, or default to most active sessions (high signal, no setup).
2. Discover before you filter
Event names and URLs vary per project — never assume $pageview paths, a signup_completed event, or
a person property exists. Confirm with read-data-schema (event_properties,
event_property_values, entity_property_values) before putting a value in a filter. If the needed
event/property doesn't exist, say so and suggest the closest available signal.
3. Run a minimal query
Call query-session-recordings-list with only the filters that serve the goal. Recommended settings:
set
filter_test_accounts: true(the tool defaults tofalse) to exclude internal users, unless the user is debugging their own session.date_fromof-7dto-30dfor goal-based searches;-3dfor "recent".A deliberate
order—activity_scorefor "interesting",console_error_countfor "broken",start_timefor "recent".limit: 10— you want a shortlist, not a dump.
4. Triage and present
Don't relay raw rows. Pick the 3-5 most promising and say why each is worth watching (long active
duration, many errors, reached the key page, high activity score). Deep-link each as
{posthog_base_url}/replay/{id} — never /replay/home?sessionRecordingId={id}. Note total matches so
the user knows how much is behind the shortlist.
5. Offer the next step
"Want me to walk through one?" →
investigating-replay."Want to keep watching these?" → save it as a saved filter view with
session-recording-playlist-create(type: 'filters'— a filter view, not a'collection', which is for manually curated recordings and can't carry filters).
Starting points → filters
Two filter shapes cover almost everything:
Reached a page → recording metric
visited_page({ "type": "recording", "key": "visited_page", "operator": "icontains", "value": "/pricing" }).Did a specific event (signup, search, rageclick, used a feature) → there is no event-name filter on the recordings query, so first collect session IDs with
execute-sql, then pass them assession_ids(see the two-step pattern below).
| User goal | Approach |
|---|---|
| Signup / onboarding / pricing / checkout friction | visited_page icontains the relevant path (confirm the real path first). Order start_time, or console_error_count to surface broken ones. |
| A specific feature | Two-step: execute-sql for $session_ids where the feature event fired, then session_ids. Pair with visited_page if the feature lives on one page. |
| Rageclicks / frustration | Two-step on the $rageclick event → session_ids. |
| Errors / something broken | properties: [{ "type": "recording", "key": "console_error_count", "operator": "gt", "value": 0 }], order console_error_count. |
| A/B test / feature flag | { "type": "flag", "key": "<flag-key>", "operator": "flag_evaluates_to", "value": "<variant or true>" }. |
| A specific person / segment | person_uuid, a person property filter (e.g. email), or a cohort filter (cohorts-list for the id). |
| Mobile / responsive issues | { "type": "event", "key": "$device_type", "operator": "exact", "value": ["Mobile"] }, or { "type": "event", "key": "$screen_width", "operator": "lt", "value": 600 }. |
| Most active users / "just show me good ones" | No filter; order: "activity_score". The reliable default when the user has no specific goal. |
| Most active pages | execute-sql to rank $pageview by URL, then filter recordings by the hottest page's visited_page. |
Two-step pattern: "sessions where event X happened"
The recordings query filters by event properties, not event names. To find sessions that contain a particular event, collect the session IDs first:
posthog:execute-sql
SELECT $session_id
FROM events
WHERE event = '$rageclick' -- or your signup/search/feature event (confirm via read-data-schema)
AND timestamp > now() - INTERVAL 7 DAY
AND $session_id != ''
GROUP BY $session_id
ORDER BY max(timestamp) DESC -- recent first: UUIDs aren't time-ordered, so the LIMIT must keep the freshest sessions
LIMIT 100Then fetch those recordings (some session IDs won't have a recording — that's expected). Pass the same
date_from window as the SQL step — with only session_ids, the query falls back to its -3d default
and would drop sessions whose event was older than that:
posthog:query-session-recordings-list
{ "date_from": "-7d", "session_ids": ["<id1>", "<id2>", "..."] }Worked example
User: "Why are people bouncing on our pricing page? Show me some sessions."
Goal = pricing-page friction →
visited_pageapproach.read-data-schema(event_property_valuesfor$pathname) to confirm the path is/pricing.Query:
posthog:query-session-recordings-list
{
"date_from": "-14d",
"filter_test_accounts": true,
"order": "activity_score",
"limit": 10,
"properties": [
{ "type": "recording", "key": "visited_page", "operator": "icontains", "value": "/pricing" }
]
}Present the 3-5 most active, each as
{base}/replay/{id}, noting which lingered or hit errors.Offer to investigate the most promising one (
investigating-replay) or save it as a saved filter view (type: 'filters').
Tips
Prefer one good filter over many — over-filtering returns nothing and reads as "no data".
If a query returns zero recordings, widen the date range or loosen the filter before concluding there's nothing to watch; if it's still empty, recordings may not be captured for that flow (point the user to
diagnosing-missing-recordings).activity_scoreis a solid default proxy for "worth watching" when there's no sharper signal — but it rewards raw interaction volume, so prefer a goal-based filter (errors, a key page) when you have one.Keep the shortlist short. The value is in choosing for the user, not handing back the haystack.
Related skills
investigating-replay— analyze one of the shortlisted sessions in depthdiagnosing-missing-recordings— when queries keep coming back empty and capture itself is in doubtcreating-replay-vision-scanners— turn a recurring shortlist into a scheduled Replay Vision scanner
Files
- ATTRIBUTION.mdAdded by AutoGineer869 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md10.1 KiB
LICENSE
MIT License Copyright (c) 2025 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- PostHog
- Publisher
- PostHog (Official)
- Source
- PostHog/skills · skills/omnibus/finding-sessions-to-watch · commit a5d30e7
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by PostHog or PostHog.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download finding-sessions-to-watch.zip