signals-scout-revenue-analytics
Focused Signals scout for PostHog projects using revenue analytics. Watches the derived revenue product for upstream failures (Stripe sync stalls, capture regressions), config drift (missing subscription property, currency mix surprises, broken Stripe↔person joins, deferred-revenue gaps), and goal-miss escalations. Emits findings only when they clear the confidence bar; otherwise writes durable memory and closes out empty. Self-contained peer in the signals-scout-* fleet — no dependencies on other skills. Picked uniformly at random by the coordinator alongside `signals-scout-general` and other specialists.
What this skill does
# 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, memory entry, not emit.
## 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:
- `signals-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.
- `signals-scout-runs-list` (last 7d) — what prior revenue runs found and ruled out.
- `signals-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 emit |
| 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 `existing_inbox_reports` for an open warehouse-source report — if so,
surface the **revenue-specific** angle (which finance metrics are wrong) rather
than re-emitting the same warehouse failure.
The warehouse failure is the recovery action; the revenue angle is the **business
impact** prose: which dashboards, who reads them, what's wrong by how much.
#### Revenue event capture regression
Team configured `purchase_completed` (or similar) as their revenue event. Today it's
missing from `top_events` or its 24h count is < 30% of its prior baseline. MRR for
event-source customers will be artificially low; the gross revenue chart will look
like a step-change drop.
Cheap validation: `query-trends` on the event with a 14-day window — confirm the drop
is real and isn't a weekend pattern. Pair with `read-data-schema event_properties` to
check whether the revenue property itself stopped flowing (event still firing but with
`null` revenue) — different upstream cause, same downstream symptom.
High-confidence finding when:
- 14-day trend shows a clear inflection, not a normal weekly cycle.
- Event still defined in `RevenueAnalyticsConfig` (team didn't intentionally rename it).
- Recent deploy / SDK upgrade timing matches the inflection (hint, not proof).
#### Subscription property missing → MRR is empty
Event source configured for a subscription business, but
`RevenueAnalyticsConfig.events[].subscriptionProperty` is null. The MRR view will be
empty because PostHog can't tell which charges belong to the same subscription. The
dashboard renders but only gross revenue is meaningful.
Detect: events configured with revenue + currency but no subscription property;
gross-revenue chart populated, MRR chart empty. Scratchpad-level finding for
new-onboarding teams; emit-worthy if the team has been live long enough that they
should have noticed.
#### Currency mix surprise
`execute-sql` on `revenue_analytics.all.revenue_analytics_charge`:
```sql
SELECT original_currency, count(), sum(original_amount)
FROM revenue_analytics.all.revenue_analytics_charge
WHERE timestamp > now() - INTERVAL 30 DAY
GROUP BY 1 ORDER BY 2 DESC
```
A currency that's never appeared before, or whose share suddenly jumped, usually means
either (a) the team is selling into a new market — write a scratchpad entry, no emit,
or (b) currency property is misconfigured and revenue is being mis-tagged. The (b) case
shows up as a single dominant currency on a non-USD team or vice versa. Cross-reference
with `RevenueAnalyticsEventItem.currencyProperty` to tell them apart.
#### Stripe-customer ↔ PostHog-person join broken
Stripe customers should carry `posthog_person_distinct_id` metadata so PostHog can
attach revenue to the person profile. If newly-created customers stop carrying that
metadata (post-deploy regression in checkout flow), aggregate views still work but
person-level revenue (group analytics, customer journeys) goes dark.
Detect via the `customer` view: count of customers with non-null
`posthog_person_distinct_id` in last 30d vs the 30d before. Scratchpad-worthy if the
team isn't using person-level revenue features; emit-worthy if they are (check
`popular_insights` for person-breakdown revenue charts).
#### Deferred revenue not deferring
Stripe source healthy, but invoice line items missing the `period` property. The
dashboard will show monthly revenue lumpy (annual subscriptions land in one month)
instead of spread across the service period. Check the `revenue_item` view: rows where
`is_recurring = true` and `period_start` / `period_end` are null. Emit when more than
~20% of recurring rows are missing period info — finance reporting wrong in a subtle
way.
#### Goal miss withouRelated in Data & Analytics
clawarr-suite
IncludedComprehensive management for self-hosted media stacks (Sonarr, Radarr, Lidarr, Readarr, Prowlarr, Bazarr, Overseerr, Plex, Tautulli, SABnzbd, Recyclarr, Unpackerr, Notifiarr, Maintainerr, Kometa, FlareSolverr). Deep library exploration, analytics, dashboard generation, content management, request handling, subtitle management, indexer control, download monitoring, quality profile sync, library cleanup automation, notification routing, collection/overlay management, and media tracker integration (Trakt, Letterboxd, Simkl).
querying-soql
IncludedSOQL query generation, optimization, and analysis with 100-point scoring. Use this skill when the user needs SOQL/SOSL authoring or optimization: natural-language-to-query generation, relationship queries, aggregates, query-plan analysis, and performance or safety improvements for Salesforce queries. TRIGGER when: user writes, optimizes, or debugs SOQL/SOSL queries, touches .soql files, or asks about relationship queries, aggregates, or query performance. DO NOT TRIGGER when: bulk data operations (use handling-sf-data), Apex DML logic (use generating-apex), or report/dashboard queries.
app-store-optimization
IncludedApp Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklists, and tracking ranking changes.
habit-flow
IncludedAI-powered atomic habit tracker with natural language logging, streak tracking, smart reminders, and coaching. Use for creating habits, logging completions naturally ("I meditated today"), viewing progress, and getting personalized coaching.
app-store-optimization
IncludedApp Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklists, and tracking ranking changes.
visualizing-data
IncludedBuilds dashboards, reports, and data-driven interfaces requiring charts, graphs, or visual analytics. Provides systematic framework for selecting appropriate visualizations based on data characteristics and analytical purpose. Includes 24+ visualization types organized by purpose (trends, comparisons, distributions, relationships, flows, hierarchies, geospatial), accessibility patterns (WCAG 2.1 AA compliance), colorblind-safe palettes, and performance optimization strategies. Use when creating visualizations, choosing chart types, displaying data graphically, or designing data interfaces.