[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-posthog-auditing-warehouse-view-health":3,"mdc--gqyzc2-key":48,"related-repo-posthog-auditing-warehouse-view-health":662,"related-org-posthog-auditing-warehouse-view-health":756},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":43,"sourceUrl":46,"mdContent":47},"auditing-warehouse-view-health","audit PostHog materialized view health","Audit the health of a PostHog project's materialized views (saved queries) — find every failed materialization and flag unused or stale materialized views that cost storage and compute. Use when the user asks \"which of my views are broken?\", \"why is this materialized view failing?\", \"are any of my views wasting compute?\", or wants a one-shot triage of view health. For source\u002Fsync health use `auditing-warehouse-source-health`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"posthog","PostHog","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fposthog.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Performance","performance","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Data Warehouse","data-warehouse",{"name":21,"slug":22,"type":15},"Audit","audit",35568,"https:\u002F\u002Fgithub.com\u002FPostHog\u002Fposthog","2026-06-18T08:25:10.936787",null,2977,[29,30,31,32,19,33,34,35,36,37,38,39,40,41,42],"ab-testing","ai-analytics","analytics","cdp","experiments","feature-flags","javascript","product-analytics","python","react","session-replay","surveys","typescript","web-analytics",{"repoUrl":24,"stars":23,"forks":27,"topics":44,"description":45},[29,30,31,32,19,33,34,35,36,37,38,39,40,41,42],"🦔 PostHog is an all-in-one developer platform for building successful products. We offer product analytics, web analytics, session replay, error tracking, feature flags, experimentation, surveys, data warehouse, a CDP, and an AI product assistant to help debug your code, ship features faster, and keep all your usage and customer data in one stack.","https:\u002F\u002Fgithub.com\u002FPostHog\u002Fposthog\u002Ftree\u002FHEAD\u002Fproducts\u002Fdata_warehouse\u002Fskills\u002Fauditing-warehouse-view-health","---\nname: auditing-warehouse-view-health\ndescription: >\n  Audit the health of a PostHog project's materialized views (saved queries) — find every failed materialization and\n  flag unused or stale materialized views that cost storage and compute. Use when the user asks \"which of my views are\n  broken?\", \"why is this materialized view failing?\", \"are any of my views wasting compute?\", or wants a one-shot\n  triage of view health. For source\u002Fsync health use `auditing-warehouse-source-health`.\n---\n\n# Auditing data warehouse view health\n\nThis skill produces a project-wide audit of **materialized views** (materialized saved queries) in the data warehouse\n— which ones are failing, and which are materialized but unused. Use it when the user wants a summary of view health,\nnot a deep-dive on one failure.\n\nThe same underlying endpoint (`data-warehouse-data-health-issues-retrieve`) also reports source, sync, batch-export,\nand transformation issues. Source and sync health is covered by `auditing-warehouse-source-health`. Destinations\n(batch exports) and transformations are owned by other products — surface them if they appear, but route them to the\nrelevant team rather than diagnosing here.\n\n## When to use this skill\n\n- \"Which of my views are broken?\" \u002F \"Why is this materialized view failing?\"\n- \"Are any of my materialized views wasting compute?\"\n- Reviewing view health after a HogQL or schema change\n- Dashboards backed by materialized views are stale or erroring\n\n## Available tools\n\n| Tool                                         | Purpose                                                             |\n| -------------------------------------------- | ------------------------------------------------------------------- |\n| `data-warehouse-data-health-issues-retrieve` | One-shot: all failed\u002Fdegraded items across the whole pipeline       |\n| `view-list`                                  | All saved queries \u002F materialized views with status and latest_error |\n| `view-run-history`                           | Run history for a specific materialized view                        |\n\nFilter the `data-health-issues` results to the `materialized_view` type for this audit. Use `view-list` when you need\nmore than the active-failure summary (non-failing views, materialization flags, last-queried info) and\n`view-run-history` to see the run trail for a specific view.\n\n## What counts as a view \"issue\"\n\nFrom the data-health endpoint, this audit cares about one of the five categories:\n\n| `type`              | Trigger                                                       | Typical urgency |\n| ------------------- | ------------------------------------------------------------- | --------------- |\n| `materialized_view` | `DataWarehouseSavedQuery.is_materialized=true, status=Failed` | Medium          |\n\nEach entry includes `id`, `name`, `type`, `status`, `error`, `failed_at`, and `url`.\n\nThe other categories the endpoint returns are out of scope for this skill:\n\n- `source` \u002F `external_data_sync` → `auditing-warehouse-source-health`\n- `destination` (batch export) → owned by the batch exports \u002F data pipelines product\n- `transformation` (HogFunction) → owned by the CDP \u002F ingestion side\n\nNote the data-health endpoint only reports _active failures_. For views it doesn't flag:\n\n- Non-materialized views with errors (only materialized views are reported)\n- Materialized views that are healthy but unused (costing compute every run) — see Step 4\n\n## Workflow\n\n### Step 1 — One-shot pull\n\nCall `data-warehouse-data-health-issues-retrieve` and keep the `materialized_view` entries.\n\nIf there are no view issues, tell the user their materialized views are healthy and stop. Don't invent problems.\n\n### Step 2 — Triage failures\n\nMaterialized view failures are usually independent of sources — a view failure is a HogQL or data issue in the view\nitself (syntax error, missing table reference, type mismatch). For each failing view, surface the `error` and point\nat the offending query. Use `view-run-history` if the user wants the failure trail.\n\n### Step 3 — Present the audit\n\nRender a prioritized report. Don't dump the raw JSON — human-readable:\n\n```text\n## Materialized view health — 2 issues\n\n### 🟠 Materialized views (2)\n- monthly_revenue — view failed (syntax error in HogQL: 'FORM' instead of 'FROM')\n- active_users_30d — view failed (missing table reference)\n\nBoth are HogQL issues in the view definitions — independent of your sources. Want me to open one?\n```\n\n### Step 4 — Go beyond active failures (when asked)\n\n**Unused materialized views:**\nCall `view-list`. Materialized views cost storage and compute every run. If any are marked materialized but haven't\nbeen queried lately, surface them as cleanup candidates (the data is available via `view-list`; unmaterialize via\n`view-unmaterialize`).\n\nOnly run this extra check if the user explicitly asks for a broader audit.\n\n### Step 5 — Offer the next step\n\nEnd the audit with a clear hand-off — e.g. \"Want me to open `monthly_revenue` and fix the HogQL?\" Never apply fixes\nautonomously from an audit; confirm explicitly before editing or unmaterializing a view.\n\n## Important notes\n\n- **The audit is read-only.** Never call destructive tools (e.g. `view-unmaterialize`, `view-delete`) from the audit\n  flow without explicit confirmation.\n- **Empty = healthy.** Don't pad an empty audit with hypothetical issues. \"No view issues found\" is a good answer.\n- **View failures are usually self-contained.** Unlike source failures, a failed materialized view rarely cascades —\n  it's a query problem in that view. Don't imply a broader outage.\n- **Sources, syncs, destinations, and transformations are out of scope here.** They share the data-health endpoint\n  but belong to other audits\u002Fproducts — route, don't diagnose.\n",{"data":49,"body":50},{"name":4,"description":6},{"type":51,"children":52},"root",[53,62,76,98,105,130,136,214,249,255,260,316,372,377,426,439,452,458,465,484,489,495,514,520,525,537,543,575,580,586,599,605],{"type":54,"tag":55,"props":56,"children":58},"element","h1",{"id":57},"auditing-data-warehouse-view-health",[59],{"type":60,"value":61},"text","Auditing data warehouse view health",{"type":54,"tag":63,"props":64,"children":65},"p",{},[66,68,74],{"type":60,"value":67},"This skill produces a project-wide audit of ",{"type":54,"tag":69,"props":70,"children":71},"strong",{},[72],{"type":60,"value":73},"materialized views",{"type":60,"value":75}," (materialized saved queries) in the data warehouse\n— which ones are failing, and which are materialized but unused. Use it when the user wants a summary of view health,\nnot a deep-dive on one failure.",{"type":54,"tag":63,"props":77,"children":78},{},[79,81,88,90,96],{"type":60,"value":80},"The same underlying endpoint (",{"type":54,"tag":82,"props":83,"children":85},"code",{"className":84},[],[86],{"type":60,"value":87},"data-warehouse-data-health-issues-retrieve",{"type":60,"value":89},") also reports source, sync, batch-export,\nand transformation issues. Source and sync health is covered by ",{"type":54,"tag":82,"props":91,"children":93},{"className":92},[],[94],{"type":60,"value":95},"auditing-warehouse-source-health",{"type":60,"value":97},". Destinations\n(batch exports) and transformations are owned by other products — surface them if they appear, but route them to the\nrelevant team rather than diagnosing here.",{"type":54,"tag":99,"props":100,"children":102},"h2",{"id":101},"when-to-use-this-skill",[103],{"type":60,"value":104},"When to use this skill",{"type":54,"tag":106,"props":107,"children":108},"ul",{},[109,115,120,125],{"type":54,"tag":110,"props":111,"children":112},"li",{},[113],{"type":60,"value":114},"\"Which of my views are broken?\" \u002F \"Why is this materialized view failing?\"",{"type":54,"tag":110,"props":116,"children":117},{},[118],{"type":60,"value":119},"\"Are any of my materialized views wasting compute?\"",{"type":54,"tag":110,"props":121,"children":122},{},[123],{"type":60,"value":124},"Reviewing view health after a HogQL or schema change",{"type":54,"tag":110,"props":126,"children":127},{},[128],{"type":60,"value":129},"Dashboards backed by materialized views are stale or erroring",{"type":54,"tag":99,"props":131,"children":133},{"id":132},"available-tools",[134],{"type":60,"value":135},"Available tools",{"type":54,"tag":137,"props":138,"children":139},"table",{},[140,159],{"type":54,"tag":141,"props":142,"children":143},"thead",{},[144],{"type":54,"tag":145,"props":146,"children":147},"tr",{},[148,154],{"type":54,"tag":149,"props":150,"children":151},"th",{},[152],{"type":60,"value":153},"Tool",{"type":54,"tag":149,"props":155,"children":156},{},[157],{"type":60,"value":158},"Purpose",{"type":54,"tag":160,"props":161,"children":162},"tbody",{},[163,180,197],{"type":54,"tag":145,"props":164,"children":165},{},[166,175],{"type":54,"tag":167,"props":168,"children":169},"td",{},[170],{"type":54,"tag":82,"props":171,"children":173},{"className":172},[],[174],{"type":60,"value":87},{"type":54,"tag":167,"props":176,"children":177},{},[178],{"type":60,"value":179},"One-shot: all failed\u002Fdegraded items across the whole pipeline",{"type":54,"tag":145,"props":181,"children":182},{},[183,192],{"type":54,"tag":167,"props":184,"children":185},{},[186],{"type":54,"tag":82,"props":187,"children":189},{"className":188},[],[190],{"type":60,"value":191},"view-list",{"type":54,"tag":167,"props":193,"children":194},{},[195],{"type":60,"value":196},"All saved queries \u002F materialized views with status and latest_error",{"type":54,"tag":145,"props":198,"children":199},{},[200,209],{"type":54,"tag":167,"props":201,"children":202},{},[203],{"type":54,"tag":82,"props":204,"children":206},{"className":205},[],[207],{"type":60,"value":208},"view-run-history",{"type":54,"tag":167,"props":210,"children":211},{},[212],{"type":60,"value":213},"Run history for a specific materialized view",{"type":54,"tag":63,"props":215,"children":216},{},[217,219,225,227,233,235,240,242,247],{"type":60,"value":218},"Filter the ",{"type":54,"tag":82,"props":220,"children":222},{"className":221},[],[223],{"type":60,"value":224},"data-health-issues",{"type":60,"value":226}," results to the ",{"type":54,"tag":82,"props":228,"children":230},{"className":229},[],[231],{"type":60,"value":232},"materialized_view",{"type":60,"value":234}," type for this audit. Use ",{"type":54,"tag":82,"props":236,"children":238},{"className":237},[],[239],{"type":60,"value":191},{"type":60,"value":241}," when you need\nmore than the active-failure summary (non-failing views, materialization flags, last-queried info) and\n",{"type":54,"tag":82,"props":243,"children":245},{"className":244},[],[246],{"type":60,"value":208},{"type":60,"value":248}," to see the run trail for a specific view.",{"type":54,"tag":99,"props":250,"children":252},{"id":251},"what-counts-as-a-view-issue",[253],{"type":60,"value":254},"What counts as a view \"issue\"",{"type":54,"tag":63,"props":256,"children":257},{},[258],{"type":60,"value":259},"From the data-health endpoint, this audit cares about one of the five categories:",{"type":54,"tag":137,"props":261,"children":262},{},[263,288],{"type":54,"tag":141,"props":264,"children":265},{},[266],{"type":54,"tag":145,"props":267,"children":268},{},[269,278,283],{"type":54,"tag":149,"props":270,"children":271},{},[272],{"type":54,"tag":82,"props":273,"children":275},{"className":274},[],[276],{"type":60,"value":277},"type",{"type":54,"tag":149,"props":279,"children":280},{},[281],{"type":60,"value":282},"Trigger",{"type":54,"tag":149,"props":284,"children":285},{},[286],{"type":60,"value":287},"Typical urgency",{"type":54,"tag":160,"props":289,"children":290},{},[291],{"type":54,"tag":145,"props":292,"children":293},{},[294,302,311],{"type":54,"tag":167,"props":295,"children":296},{},[297],{"type":54,"tag":82,"props":298,"children":300},{"className":299},[],[301],{"type":60,"value":232},{"type":54,"tag":167,"props":303,"children":304},{},[305],{"type":54,"tag":82,"props":306,"children":308},{"className":307},[],[309],{"type":60,"value":310},"DataWarehouseSavedQuery.is_materialized=true, status=Failed",{"type":54,"tag":167,"props":312,"children":313},{},[314],{"type":60,"value":315},"Medium",{"type":54,"tag":63,"props":317,"children":318},{},[319,321,327,329,335,336,341,342,348,349,355,356,362,364,370],{"type":60,"value":320},"Each entry includes ",{"type":54,"tag":82,"props":322,"children":324},{"className":323},[],[325],{"type":60,"value":326},"id",{"type":60,"value":328},", ",{"type":54,"tag":82,"props":330,"children":332},{"className":331},[],[333],{"type":60,"value":334},"name",{"type":60,"value":328},{"type":54,"tag":82,"props":337,"children":339},{"className":338},[],[340],{"type":60,"value":277},{"type":60,"value":328},{"type":54,"tag":82,"props":343,"children":345},{"className":344},[],[346],{"type":60,"value":347},"status",{"type":60,"value":328},{"type":54,"tag":82,"props":350,"children":352},{"className":351},[],[353],{"type":60,"value":354},"error",{"type":60,"value":328},{"type":54,"tag":82,"props":357,"children":359},{"className":358},[],[360],{"type":60,"value":361},"failed_at",{"type":60,"value":363},", and ",{"type":54,"tag":82,"props":365,"children":367},{"className":366},[],[368],{"type":60,"value":369},"url",{"type":60,"value":371},".",{"type":54,"tag":63,"props":373,"children":374},{},[375],{"type":60,"value":376},"The other categories the endpoint returns are out of scope for this skill:",{"type":54,"tag":106,"props":378,"children":379},{},[380,404,415],{"type":54,"tag":110,"props":381,"children":382},{},[383,389,391,397,399],{"type":54,"tag":82,"props":384,"children":386},{"className":385},[],[387],{"type":60,"value":388},"source",{"type":60,"value":390}," \u002F ",{"type":54,"tag":82,"props":392,"children":394},{"className":393},[],[395],{"type":60,"value":396},"external_data_sync",{"type":60,"value":398}," → ",{"type":54,"tag":82,"props":400,"children":402},{"className":401},[],[403],{"type":60,"value":95},{"type":54,"tag":110,"props":405,"children":406},{},[407,413],{"type":54,"tag":82,"props":408,"children":410},{"className":409},[],[411],{"type":60,"value":412},"destination",{"type":60,"value":414}," (batch export) → owned by the batch exports \u002F data pipelines product",{"type":54,"tag":110,"props":416,"children":417},{},[418,424],{"type":54,"tag":82,"props":419,"children":421},{"className":420},[],[422],{"type":60,"value":423},"transformation",{"type":60,"value":425}," (HogFunction) → owned by the CDP \u002F ingestion side",{"type":54,"tag":63,"props":427,"children":428},{},[429,431,437],{"type":60,"value":430},"Note the data-health endpoint only reports ",{"type":54,"tag":432,"props":433,"children":434},"em",{},[435],{"type":60,"value":436},"active failures",{"type":60,"value":438},". For views it doesn't flag:",{"type":54,"tag":106,"props":440,"children":441},{},[442,447],{"type":54,"tag":110,"props":443,"children":444},{},[445],{"type":60,"value":446},"Non-materialized views with errors (only materialized views are reported)",{"type":54,"tag":110,"props":448,"children":449},{},[450],{"type":60,"value":451},"Materialized views that are healthy but unused (costing compute every run) — see Step 4",{"type":54,"tag":99,"props":453,"children":455},{"id":454},"workflow",[456],{"type":60,"value":457},"Workflow",{"type":54,"tag":459,"props":460,"children":462},"h3",{"id":461},"step-1-one-shot-pull",[463],{"type":60,"value":464},"Step 1 — One-shot pull",{"type":54,"tag":63,"props":466,"children":467},{},[468,470,475,477,482],{"type":60,"value":469},"Call ",{"type":54,"tag":82,"props":471,"children":473},{"className":472},[],[474],{"type":60,"value":87},{"type":60,"value":476}," and keep the ",{"type":54,"tag":82,"props":478,"children":480},{"className":479},[],[481],{"type":60,"value":232},{"type":60,"value":483}," entries.",{"type":54,"tag":63,"props":485,"children":486},{},[487],{"type":60,"value":488},"If there are no view issues, tell the user their materialized views are healthy and stop. Don't invent problems.",{"type":54,"tag":459,"props":490,"children":492},{"id":491},"step-2-triage-failures",[493],{"type":60,"value":494},"Step 2 — Triage failures",{"type":54,"tag":63,"props":496,"children":497},{},[498,500,505,507,512],{"type":60,"value":499},"Materialized view failures are usually independent of sources — a view failure is a HogQL or data issue in the view\nitself (syntax error, missing table reference, type mismatch). For each failing view, surface the ",{"type":54,"tag":82,"props":501,"children":503},{"className":502},[],[504],{"type":60,"value":354},{"type":60,"value":506}," and point\nat the offending query. Use ",{"type":54,"tag":82,"props":508,"children":510},{"className":509},[],[511],{"type":60,"value":208},{"type":60,"value":513}," if the user wants the failure trail.",{"type":54,"tag":459,"props":515,"children":517},{"id":516},"step-3-present-the-audit",[518],{"type":60,"value":519},"Step 3 — Present the audit",{"type":54,"tag":63,"props":521,"children":522},{},[523],{"type":60,"value":524},"Render a prioritized report. Don't dump the raw JSON — human-readable:",{"type":54,"tag":526,"props":527,"children":532},"pre",{"className":528,"code":530,"language":60,"meta":531},[529],"language-text","## Materialized view health — 2 issues\n\n### 🟠 Materialized views (2)\n- monthly_revenue — view failed (syntax error in HogQL: 'FORM' instead of 'FROM')\n- active_users_30d — view failed (missing table reference)\n\nBoth are HogQL issues in the view definitions — independent of your sources. Want me to open one?\n","",[533],{"type":54,"tag":82,"props":534,"children":535},{"__ignoreMap":531},[536],{"type":60,"value":530},{"type":54,"tag":459,"props":538,"children":540},{"id":539},"step-4-go-beyond-active-failures-when-asked",[541],{"type":60,"value":542},"Step 4 — Go beyond active failures (when asked)",{"type":54,"tag":63,"props":544,"children":545},{},[546,551,553,558,560,565,567,573],{"type":54,"tag":69,"props":547,"children":548},{},[549],{"type":60,"value":550},"Unused materialized views:",{"type":60,"value":552},"\nCall ",{"type":54,"tag":82,"props":554,"children":556},{"className":555},[],[557],{"type":60,"value":191},{"type":60,"value":559},". Materialized views cost storage and compute every run. If any are marked materialized but haven't\nbeen queried lately, surface them as cleanup candidates (the data is available via ",{"type":54,"tag":82,"props":561,"children":563},{"className":562},[],[564],{"type":60,"value":191},{"type":60,"value":566},"; unmaterialize via\n",{"type":54,"tag":82,"props":568,"children":570},{"className":569},[],[571],{"type":60,"value":572},"view-unmaterialize",{"type":60,"value":574},").",{"type":54,"tag":63,"props":576,"children":577},{},[578],{"type":60,"value":579},"Only run this extra check if the user explicitly asks for a broader audit.",{"type":54,"tag":459,"props":581,"children":583},{"id":582},"step-5-offer-the-next-step",[584],{"type":60,"value":585},"Step 5 — Offer the next step",{"type":54,"tag":63,"props":587,"children":588},{},[589,591,597],{"type":60,"value":590},"End the audit with a clear hand-off — e.g. \"Want me to open ",{"type":54,"tag":82,"props":592,"children":594},{"className":593},[],[595],{"type":60,"value":596},"monthly_revenue",{"type":60,"value":598}," and fix the HogQL?\" Never apply fixes\nautonomously from an audit; confirm explicitly before editing or unmaterializing a view.",{"type":54,"tag":99,"props":600,"children":602},{"id":601},"important-notes",[603],{"type":60,"value":604},"Important notes",{"type":54,"tag":106,"props":606,"children":607},{},[608,632,642,652],{"type":54,"tag":110,"props":609,"children":610},{},[611,616,618,623,624,630],{"type":54,"tag":69,"props":612,"children":613},{},[614],{"type":60,"value":615},"The audit is read-only.",{"type":60,"value":617}," Never call destructive tools (e.g. ",{"type":54,"tag":82,"props":619,"children":621},{"className":620},[],[622],{"type":60,"value":572},{"type":60,"value":328},{"type":54,"tag":82,"props":625,"children":627},{"className":626},[],[628],{"type":60,"value":629},"view-delete",{"type":60,"value":631},") from the audit\nflow without explicit confirmation.",{"type":54,"tag":110,"props":633,"children":634},{},[635,640],{"type":54,"tag":69,"props":636,"children":637},{},[638],{"type":60,"value":639},"Empty = healthy.",{"type":60,"value":641}," Don't pad an empty audit with hypothetical issues. \"No view issues found\" is a good answer.",{"type":54,"tag":110,"props":643,"children":644},{},[645,650],{"type":54,"tag":69,"props":646,"children":647},{},[648],{"type":60,"value":649},"View failures are usually self-contained.",{"type":60,"value":651}," Unlike source failures, a failed materialized view rarely cascades —\nit's a query problem in that view. Don't imply a broader outage.",{"type":54,"tag":110,"props":653,"children":654},{},[655,660],{"type":54,"tag":69,"props":656,"children":657},{},[658],{"type":60,"value":659},"Sources, syncs, destinations, and transformations are out of scope here.",{"type":60,"value":661}," They share the data-health endpoint\nbut belong to other audits\u002Fproducts — route, don't diagnose.",{"items":663,"total":755},[664,680,690,700,707,722,738],{"slug":665,"name":665,"fn":666,"description":667,"org":668,"tags":669,"stars":23,"repoUrl":24,"updatedAt":679},"analyzing-expensive-users","analyze expensive users in AI observability","Analyze the most expensive users in AI observability and explain why they cost so much. Use when the user asks about top spenders, expensive users, per-user LLM cost, user-level cost drivers, or patterns behind high AI observability spend.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[670,672,675,678],{"name":671,"slug":31,"type":15},"Analytics",{"name":673,"slug":674,"type":15},"Cost Optimization","cost-optimization",{"name":676,"slug":677,"type":15},"Observability","observability",{"name":9,"slug":8,"type":15},"2026-07-28T05:34:11.117757",{"slug":681,"name":681,"fn":682,"description":683,"org":684,"tags":685,"stars":23,"repoUrl":24,"updatedAt":689},"auditing-endpoints","audit PostHog project endpoints","Audit every endpoint in a PostHog project for staleness, failed materialisations, and unused materialised versions. Use when the user asks \"what endpoints can I clean up?\", \"are any of my endpoints broken?\", \"which materialised versions are still being called?\", or wants a one-shot cleanup pass over the Endpoints product. Produces a prioritised report grouped by issue type, with recommended actions but does not modify anything without explicit confirmation.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[686,687,688],{"name":671,"slug":31,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},"2026-06-08T08:08:33.693989",{"slug":95,"name":95,"fn":691,"description":692,"org":693,"tags":694,"stars":23,"repoUrl":24,"updatedAt":699},"audit PostHog data warehouse source health","Audit the health of a PostHog project's data warehouse sources and syncs — find every broken or degraded source connection, sync schema, and webhook channel. Use when the user asks \"why are my imports failing?\", \"what's broken with my sources?\", \"why is my warehouse data stale?\", or wants a one-shot triage of source\u002Fsync health before deciding where to dig in. Produces a prioritized report grouped by severity, with recommended next steps. For materialized-view health use `auditing-warehouse-view-health`; for a single failing sync use `diagnosing-failed-warehouse-syncs`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[695,696,697,698],{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":676,"slug":677,"type":15},{"name":9,"slug":8,"type":15},"2026-06-18T08:22:57.67984",{"slug":4,"name":4,"fn":5,"description":6,"org":701,"tags":702,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[703,704,705,706],{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":708,"name":708,"fn":709,"description":710,"org":711,"tags":712,"stars":23,"repoUrl":24,"updatedAt":721},"authoring-error-tracking-alerts","author PostHog error tracking alerts","Author error tracking alerts that fire when an issue is created, reopened, or starts spiking. Use when the user asks to set up error notifications, route exceptions to Slack\u002Fwebhook\u002FLinear, or evaluate which error events are worth alerting on. Covers trigger-event selection, integration choice, dedup against existing alerts, and shipping with the canonical message body shape.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[713,716,719,720],{"name":714,"slug":715,"type":15},"Alerting","alerting",{"name":717,"slug":718,"type":15},"Debugging","debugging",{"name":676,"slug":677,"type":15},{"name":9,"slug":8,"type":15},"2026-06-18T08:24:40.318583",{"slug":723,"name":723,"fn":724,"description":725,"org":726,"tags":727,"stars":23,"repoUrl":24,"updatedAt":737},"authoring-log-alerts","author log alerts in PostHog","Author useful, low-noise log alerts on services in a PostHog project. Use when the user asks to set up alerts for their logs, suggest alerts they should add, or evaluate whether a service is worth monitoring. Covers service triage, baseline characterisation, threshold drafting, back-testing via simulate, and shipping with a notification destination.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[728,729,732,733,736],{"name":671,"slug":31,"type":15},{"name":730,"slug":731,"type":15},"Monitoring","monitoring",{"name":676,"slug":677,"type":15},{"name":734,"slug":735,"type":15},"Operations","operations",{"name":9,"slug":8,"type":15},"2026-07-18T05:10:54.430898",{"slug":739,"name":739,"fn":740,"description":741,"org":742,"tags":743,"stars":23,"repoUrl":24,"updatedAt":754},"building-workflows","build and edit PostHog workflows","Build, edit, test, enable, and monitor PostHog workflows over MCP. Author the action\u002Fedge graph so it runs and opens cleanly in the visual editor, then change drafts surgically with patch operations. Use when asked to build, set up, automate, change, fix, or debug a workflow, campaign, broadcast, drip sequence, or event-triggered automation in the workflows product.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[744,747,750,751],{"name":745,"slug":746,"type":15},"Automation","automation",{"name":748,"slug":749,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},{"name":752,"slug":753,"type":15},"Workflow Automation","workflow-automation","2026-07-28T05:34:12.167015",61,{"items":757,"total":874},[758,765,771,778,785,792,800,807,821,836,846,864],{"slug":665,"name":665,"fn":666,"description":667,"org":759,"tags":760,"stars":23,"repoUrl":24,"updatedAt":679},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[761,762,763,764],{"name":671,"slug":31,"type":15},{"name":673,"slug":674,"type":15},{"name":676,"slug":677,"type":15},{"name":9,"slug":8,"type":15},{"slug":681,"name":681,"fn":682,"description":683,"org":766,"tags":767,"stars":23,"repoUrl":24,"updatedAt":689},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[768,769,770],{"name":671,"slug":31,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"slug":95,"name":95,"fn":691,"description":692,"org":772,"tags":773,"stars":23,"repoUrl":24,"updatedAt":699},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[774,775,776,777],{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":676,"slug":677,"type":15},{"name":9,"slug":8,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":779,"tags":780,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[781,782,783,784],{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":708,"name":708,"fn":709,"description":710,"org":786,"tags":787,"stars":23,"repoUrl":24,"updatedAt":721},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[788,789,790,791],{"name":714,"slug":715,"type":15},{"name":717,"slug":718,"type":15},{"name":676,"slug":677,"type":15},{"name":9,"slug":8,"type":15},{"slug":723,"name":723,"fn":724,"description":725,"org":793,"tags":794,"stars":23,"repoUrl":24,"updatedAt":737},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[795,796,797,798,799],{"name":671,"slug":31,"type":15},{"name":730,"slug":731,"type":15},{"name":676,"slug":677,"type":15},{"name":734,"slug":735,"type":15},{"name":9,"slug":8,"type":15},{"slug":739,"name":739,"fn":740,"description":741,"org":801,"tags":802,"stars":23,"repoUrl":24,"updatedAt":754},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[803,804,805,806],{"name":745,"slug":746,"type":15},{"name":748,"slug":749,"type":15},{"name":9,"slug":8,"type":15},{"name":752,"slug":753,"type":15},{"slug":808,"name":808,"fn":809,"description":810,"org":811,"tags":812,"stars":23,"repoUrl":24,"updatedAt":820},"check-posthog-loading","inspect PostHog SDK loading across URLs","Inspect how the PostHog JavaScript SDK is loaded across a list of URLs. Use to confirm consistent installation across pages, find pages missing the snippet, detect mismatched API keys or hosts between pages, and verify the load method (head snippet vs deferred vs array.js).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[813,814,815,818,819],{"name":671,"slug":31,"type":15},{"name":717,"slug":718,"type":15},{"name":816,"slug":817,"type":15},"Frontend","frontend",{"name":676,"slug":677,"type":15},{"name":9,"slug":8,"type":15},"2026-05-07T05:56:19.828048",{"slug":822,"name":822,"fn":823,"description":824,"org":825,"tags":826,"stars":23,"repoUrl":24,"updatedAt":835},"consuming-endpoints-from-client-code","integrate PostHog endpoints into client applications","Wire a PostHog endpoint into a client app or SDK. Covers fetching the OpenAPI spec, generating a typed client with openapi-generator or @hey-api\u002Fopenapi-ts, sending the right auth header, shaping the variables payload (HogQL code_name vs insight breakdown property), handling rate-limit and materialised-endpoint error responses. Use when the user says \"how do I call my endpoint\", \"generate a client for this\", or \"what auth header do I use\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[827,830,831,832],{"name":828,"slug":829,"type":15},"API Development","api-development",{"name":816,"slug":817,"type":15},{"name":9,"slug":8,"type":15},{"name":833,"slug":834,"type":15},"SDK","sdk","2026-06-08T08:08:34.929454",{"slug":837,"name":837,"fn":838,"description":839,"org":840,"tags":841,"stars":23,"repoUrl":24,"updatedAt":845},"copying-endpoints-across-projects","copy PostHog endpoints across projects","Copy a PostHog endpoint (a saved HogQL\u002Finsight query exposed as an API route) to another project in the same organization, or duplicate it under a new name in the same project. Use when the user wants to duplicate an endpoint, promote an endpoint from staging to production, replicate an endpoint's query\u002Fvariables\u002Ffreshness config in another workspace, or clone an endpoint to iterate on it. Unlike feature flags and experiments, endpoints have NO native cross-project copy tool — this skill covers the read-then-recreate flow (endpoint-get then endpoint-create), the active-project switching it requires, name-collision checks, and the safe defaults (land unmaterialised in the target, verify with endpoint-run). Does not cover editing endpoint versions (see managing-endpoint-versions) or authoring a brand-new endpoint from scratch (see creating-an-endpoint).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[842,843,844],{"name":828,"slug":829,"type":15},{"name":734,"slug":735,"type":15},{"name":9,"slug":8,"type":15},"2026-07-15T05:29:58.442727",{"slug":847,"name":847,"fn":848,"description":849,"org":850,"tags":851,"stars":23,"repoUrl":24,"updatedAt":863},"creating-ai-subscription","schedule recurring AI-generated PostHog reports","Create a recurring AI-generated PostHog report — schedule a free-text prompt to run on a cron, with the LLM-synthesized markdown delivered to email or Slack on each tick. Use when the user wants a recurring AI summary of X on any cadence (daily, weekly, monthly, yearly) rather than a one-off report. (To attach an AI summary to an existing insight\u002Fdashboard subscription instead of a free-text prompt, see `managing-subscriptions` and its `summary_enabled` option.)\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[852,853,856,857,860],{"name":745,"slug":746,"type":15},{"name":854,"slug":855,"type":15},"Email","email",{"name":9,"slug":8,"type":15},{"name":858,"slug":859,"type":15},"Reporting","reporting",{"name":861,"slug":862,"type":15},"Slack","slack","2026-06-09T07:32:27.935712",{"slug":865,"name":865,"fn":866,"description":867,"org":868,"tags":869,"stars":23,"repoUrl":24,"updatedAt":873},"creating-an-endpoint","create PostHog API endpoints","Create a PostHog endpoint with the right shape on the first try — covers query kind choice, name conventions, what to expose as variables (HogQL code_name vs insight breakdown), data_freshness_seconds, and whether to materialise on day one. Use when the user says \"create an endpoint\", \"expose this query as an API\", \"turn this insight into an endpoint\", or asks for help structuring a new endpoint. Steers away from common mistakes: materialising a query with cohort breakdowns or compare mode, inline-only variables on a materialised endpoint, unbounded date ranges, ambiguous names.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[870,871,872],{"name":671,"slug":31,"type":15},{"name":828,"slug":829,"type":15},{"name":9,"slug":8,"type":15},"2026-06-08T08:08:29.624498",231]