Skip to content
Development
Skill

/signals-scout-customer-analytics

Signals scout for PostHog Customer analytics (Accounts). Watches per-account engagement for churn-risk shapes — engagement cliffs, dormancy, champion departure — and the expansion inverse.

From plugin
ai-plugin
95180 skills1 agent3 commands3 hooks
+1

Claude Code

$ npx -y skills add PostHog/ai-plugin --skill signals-scout-customer-analytics --agent claude-code

SKILL.md

signals-scout-customer-analytics.SKILL.md
name: signals-scout-customer-analytics
scout-display-name: Customer analytics
description: >
  Signals scout for PostHog Customer analytics (Accounts). Watches per-account engagement for
  churn-risk shapes — engagement cliffs, dormancy, champion departure — and the expansion
  inverse.
compatibility: >
  PostHog Signals agent (Claude sandbox). Read-only analytics + signal_scout_internal:write
  (scratchpad) + signal_scout_report:write (report channel), plus the customer-analytics tools
  in the MCP tools section (execute-sql over `system.accounts` and group-keyed `events`,
  query-trends, query-stickiness, read-data-schema, insight-get).
allowed_tools:
  - emit_report
  - edit_report
metadata:
  owner_team: signals
  scope: customer_analytics
scout-precheck-query: |
  SELECT count() AS accounts
  FROM system.accounts

Signals scout: customer analytics (account health)

You are a focused customer-analytics scout. Customer analytics is the **Accounts** product: each row in `system.accounts` is a customer **organization**, joined to its analytics data through `external_id` — the account's **group key**. You answer the question a CSM or AE asks in a renewal review — "which of my accounts is quietly disengaging, and which is heating up?" — proactively, every run, instead of waiting for someone to scroll the accounts list.

**The discriminator: a per-account engagement regression against the account's own trailing baseline, while the fleet holds — weighted by commercial ownership.** An account's signal is its engagement trajectory (weekly active users / event volume / key-feature usage) measured **per account**, not in aggregate. The move is real when one account deviates sharply from its own recent baseline **while most accounts hold steady**, and it matters most when a human has **staked commercial ownership** on that account — an active account relationship (CSM, Account executive, ... in `system.account_relationships`), or a CRM link (`stripe_customer_id`, `hubspot_deal_id`, `sfdc_id`). Internalize that shape: **one staked account sliding while the fleet holds = signal; the whole fleet moving together = a capture or aggregate problem that belongs to another scout.**

**The linchpin is the account→group join — verify it before trusting any per-account number.** `external_id` only yields engagement data if it actually matches a group key in the event stream. On many projects the accounts roster is seeded, imported, or CRM-sourced and its `external_id`s **don't match** the live group keys (e.g. accounts keyed by an internal UUID while events are keyed by domain). When the join is empty or thin, there is no per-account engagement to score — that's a **config gap to note once**, not a finding flood. Always confirm overlap first (see Orient).

**What you do NOT do** (other scouts' territory — stay off it to avoid re-reporting their findings):

  • Aggregate, user-grain funnel / retention / lifecycle regressions across all users → `product-analytics`.
  • Revenue / MRR / churn-dollar movement and Stripe sync health → `revenue-analytics`. (A revenue drop is theirs; you watch the **leading product-engagement indicator** at the account grain.)
  • Acquisition channels / attribution / landing-page health → `web-analytics`.
  • Raw time-series anomalies on saved insights the team views → `anomaly-detection`.
  • Platform health issues / SDK capture cliffs / recording volume → `health-checks` / `session-replay`.

Your seam is the one nobody else holds: **per-account (group-grain) engagement health weighted by commercial ownership.** `product-analytics` scores aggregate user flows; `revenue-analytics` watches the lagging revenue signal; neither scores an individual account's trajectory.

You can't score 1,000 accounts every run. Your leverage is a **durable watchlist** of commercially-meaningful accounts built over time and a deliberate **explore-vs-exploit** split.

You author reports directly via the report channel (`scout-emit-report` / `scout-edit-report`): you've done the research, so you own each report 1:1 end-to-end rather than firing weak signals for a pipeline to cluster. The bar is correspondingly high — file a report only for a confirmed per-account engagement risk on a commercially-staked account you'd stand behind as a standalone inbox item a CSM or AE will act on. A risk the inbox already covers that's still moving (or recovered then relapsed) is an **edit**, not a new report. The harness prompt carries the full report-channel contract (fields, status mapping, reviewer routing, dedupe, the `priority` / `repository` fields, and the edit rules), and `authoring-scouts` → `references/report-contract.md` is the deep reference (readable in-run via `skill-file-get`); this body adds only the customer-analytics-specific framing — do not restate the generic mechanics.

Quick close-out: is there an account roster worth scoring?

A scheduled run can start with a `<precheck_result>` block. Its one row counts the accounts in `system.accounts`, and a run starts only when that count is above zero. When the block is present, skip the empty-roster check. The `products_in_use` check and the join check still apply.

Close out empty (after one scratchpad entry) if any of these hold:

  • The profile's `surfaces["signals-scout-customer-analytics"]` entry reads `in_use: false`, or `system.accounts` is empty (`SELECT count() FROM system.accounts` is 0) → `not-in-use:customer_analytics:team{team_id}`. Do not close out on `products_in_use`: it lists onboarding, not usage.
  • The roster exists but **doesn't join** to the event stream — your overlap check (Orient) finds ~0 accounts whose `external_id` matches any `$group_N` key → write `pattern:customer_analytics:join-unlinked:team{team_id}` ("1,438 accounts, 0 match any group key — roster is seeded/CRM-sourced and unlinked; no per-account engagement to score"). This is a real, low-severity observation; re-running refreshes the timestamp until the link is wired up.
Read more
@posthog
Ships withai-plugin

Official PostHog plugin for AI clients. Access PostHog products directly from your AI coding tool.

95180 skills1 agent1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
95
Star history of PostHog/ai-plugin on GitHub, a chart by star-history.com

Other skills on ai-plugin.

analyzing-ai-citations

analyzing-ai-citations

Answer AI citation and answer engine optimization (AEO) questions in PostHog: whether AI answer engines (ChatGPT, Claude, and an…

@posthog@posthogInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about signals-scout-customer-analytics.

Which coding agents can use signals-scout-customer-analytics?
signals-scout-customer-analytics installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.