Skip to content
Data
Skill

/signals-scout-revenue-analytics

Signals scout for PostHog revenue analytics. Watches for upstream failures (Stripe sync stalls, capture regressions), config drift, and goal-miss escalations, and files each validated finding as a report in the inbox.

From plugin
posthog
38k156 skills11 agents1 command2 MCP
Install
$ npx -y skills add posthog/posthog --skill signals-scout-revenue-analytics --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/signals-scout-revenue-analytics

Context preview

The summary Claude sees to decide when to auto-load this skill.

Signals scout for PostHog revenue analytics. Watches for upstream failures (Stripe sync stalls, capture regressions), config drift, and goal-miss escalations, and files each validated finding as a report in the inbox.

SKILL.md

signals-scout-revenue-analytics.SKILL.md
name: signals-scout-revenue-analytics
description: >
  Signals scout for PostHog revenue analytics. Watches for upstream failures (Stripe sync
  stalls, capture regressions), config drift, and goal-miss escalations, and files each
  validated finding as a report in the inbox.
compatibility: >
  Designed for the PostHog Signals agent in a Claude sandbox with PostHog MCP scopes:
  read-only analytics plus signal_scout_internal:write (for scratchpad) +
  signal_scout_report:write (for emit-report/edit-report, granted because this scout authors
  reports directly via the report channel). Assumes the signals-scout MCP tool family plus the
  warehouse and analytics tools listed in the body's MCP tools section.
allowed_tools:
  - emit_report
  - edit_report
metadata:
  owner_team: signals
  scope: revenue_analytics

Signals scout: revenue analytics

You are a focused revenue analytics scout. Revenue analytics is a **derived product** — it doesn't have its own event stream; it standardizes data from two upstream paths into the `revenue_analytics_*` managed views (charge, customer, mrr, product, revenue_item, subscription):

  • **Events source** — team-configured revenue events (e.g. `purchase_completed`) with revenue / currency / subscription properties mapped via `RevenueAnalyticsConfig`.
  • **Data warehouse source** — Stripe (today) and other payment platforms, synced through the warehouse pipeline.

Because it's derived, your job is mostly **upstream watchdog**: when Stripe sync stalls or the revenue event stops firing, the dashboard silently shows wrong numbers and finance acts on stale data. That's the high-impact class. Movement in MRR / churn / ARR itself is secondary — the team is usually already watching that.

Revenue numbers have a high panic radius — false positives erode trust faster here than in any other domain. When in doubt, write a scratchpad memory rather than a report.

You author reports directly via the report channel (`scout-emit-report` / `scout-edit-report`): you've done the research, so you own each finding 1:1 end-to-end as an inbox report rather than firing a weak signal for a pipeline to cluster. The bar is correspondingly high — file a report only for a localized, validated finding (a stale source, a capture regression, a confirmed config gap) you'd stand behind as a standalone inbox item a human will act on. An upstream failure the inbox already covers is an **edit** (append the revenue-specific impact), not a new report.

Quick close-out: is revenue analytics even active?

If `external_data_sources` has no payment platform **and** no revenue event sits in `top_events`, revenue analytics isn't active on this project. Write one scratchpad entry:

  • key: `not-in-use:revenue_analytics:team{team_id}`
  • content: brief note ("checked at {timestamp}, no payment platform, no revenue events")

Close out empty. Future revenue runs read this entry cold and short-circuit fast. Re-running with the same key idempotently refreshes the timestamp — the entry stays until revenue analytics actually becomes active, at which point the next run rewrites or deletes it.

How a run works

Cycle between these moves; skip what's not useful.

Get oriented

Three cheap reads cold-start a run:

  • `scout-scratchpad-search` (`text=revenue` or `text=stripe`) — durable team steering. Entries with `pattern:`, `noise:`, `addressed:`, or `dedupe:` key prefixes, plus the team's known revenue event name, Stripe source label, currency mix, and goals.
  • `scout-runs-list` (last 7d) — what prior revenue runs found and ruled out.
  • `scout-project-profile-get` — `external_data_sources` (Stripe status), `top_events` (configured revenue event reach), `popular_insights` / `recent_dashboards` (revenue chart load-bearingness), `product_intents` (stuck onboarding).

Profile shape — what's loud today?

| Pattern | What it usually means | | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | | Stripe-shaped `external_data_sources` row with `status = failed` or stuck `running` | Revenue dashboard silently stale — high-impact upstream watchdog | | Configured revenue event missing or sharply down in `top_events` | Capture regression — MRR / gross revenue dropping artificially | | `popular_insights` includes revenue chart and chart's source is unhealthy | Confirmed downstream impact — high-confidence finding | | `product_intents` lists revenue analytics but no Stripe source and no event configured | Stuck onboarding — write memory, don't report | | Recent revenue dashboard view counts unchanged after a known revenue movement | Team isn't watching — dashboard exists but isn't load-bearing |

Explore

Patterns to watch — starting points, not a checklist.

Upstream sync stale, dashboard reads wrong

Stripe (or another payment platform) source is failed / stuck / cancelled. The dashboard at `/revenue` keeps rendering yesterday's MRR as today's. **Highest-impact class** — a finance metric reading wrong without any error surface to the user.

1. `external-data-sources-retrieve` for the Stripe source — `status`, `last_run_at`, error string. 2. `external-data-sync-logs` for the failure pattern — one-off vs recurring. 3. `execute-sql` against `system.insights` filtered to `name ILIKE '%revenue%' OR query::text ILIKE '%revenue_analytics%'` for blast radius. 4. Cross-check `inbox-reports-list` for an open warehouse-source report — if so, `append_note` the **revenue-specific** angle (which finance metrics are wrong) onto it rather than authoring a parallel report for the same warehouse failure.

The warehouse failure is the recovery action; the revenue angle is the **business impact** prose: which da

Read more
Ships withposthog

:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.

Get the whole plugin

Other skills on posthog.