[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-posthog-experiment-audit":3,"mdc-l7xpzy-key":40,"related-repo-posthog-experiment-audit":873,"related-org-posthog-experiment-audit":982},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":29,"repoUrl":30,"updatedAt":31,"license":32,"forks":33,"topics":34,"repo":35,"sourceUrl":38,"mdContent":39},"experiment-audit","audit PostHog A\u002FB experiments","Audit a PostHog A\u002FB experiment for a customer — verify config, exposure, attribution, and metrics. Trigger phrases include \"audit [customer]'s experiment\", \"audit the [name] experiment\", \"check experiment setup for [customer]\", \"validate this A\u002FB test\", or any request to review whether an experiment is correctly wired up. Assumes you already have MCP access to the customer's project (typically via the impersonation flow set up by the `impersonate-audit` wrapper that ships with this plugin).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"posthog","PostHog","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fposthog.png",[12,14,17,20,23,26],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Audit","audit",{"name":18,"slug":19,"type":13},"Product Management","product-management",{"name":21,"slug":22,"type":13},"Customer Success","customer-success",{"name":24,"slug":25,"type":13},"Analytics","analytics",{"name":27,"slug":28,"type":13},"A\u002FB Testing","a-b-testing",56,"https:\u002F\u002Fgithub.com\u002FPostHog\u002Fskills","2026-06-06T07:01:16.5398",null,4,[],{"repoUrl":30,"stars":29,"forks":33,"topics":36,"description":37},[],"PostHog skills (under construction)","https:\u002F\u002Fgithub.com\u002FPostHog\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fteam\u002Fcustomer-success\u002Fimpersonation-toolkit","---\nname: experiment-audit\ndescription: \"Audit a PostHog A\u002FB experiment for a customer — verify config, exposure, attribution, and metrics. Trigger phrases include \\\"audit [customer]'s experiment\\\", \\\"audit the [name] experiment\\\", \\\"check experiment setup for [customer]\\\", \\\"validate this A\u002FB test\\\", or any request to review whether an experiment is correctly wired up. Assumes you already have MCP access to the customer's project (typically via the impersonation flow set up by the `impersonate-audit` wrapper that ships with this plugin).\"\n---\n\n# Experiment Audit\n\nVerify that a customer's experiment is actually collecting variant data, that downstream attribution survives the funnel, and that the metrics measure what the customer thinks they measure. Output is a Slack-ready writeup grouped by the four questions customers almost always ask.\n\n## Step 0 — confirm scope before running\n\nThe skill assumes the active PostHog MCP is scoped to the **customer's** project, not yours. Always start with:\n\n> \"What project am I in? List the most recent 5 experiments.\"\n\nIf the project name looks like your own internal project (e.g. \"PostHog App + Website\", id 2), STOP — the impersonation isn't routing correctly. Re-run the wizard or check `\u002Fmcp` auth before continuing.\n\n## Step 1 — pull the experiment config\n\nUse `experiment-list` with `search` to find the experiment by name. Then pull the full record. Capture:\n\n- Status (running \u002F draft \u002F stopped \u002F paused) and start date.\n- Linked feature flag key and ID.\n- Variants and traffic split. Variant *names* must match what the customer's code reads — bucketing bugs are usually case\u002Ftypo mismatches.\n- Holdout, bucketing key (`device_id` vs `user_id`), and `ensure_experience_continuity`.\n- Exposure event — default `$feature_flag_called` or a custom event.\n- Primary and secondary metrics. Note action IDs, event names, breakdowns, conversion windows, attribution modes.\n- Filter test accounts setting.\n\n## Step 2 — pull the feature flag config\n\nFor the linked flag:\n\n- Release conditions — read each one carefully.\n- **Watch for two specific footguns**:\n  1. **URL targeting via person property** (`$current_url = ...`) — uses the *latest URL the person has been seen on*, not the current page. Stale by definition. Always flag as a problem.\n  2. **Exact-match on a path fragment** — `$current_url` is captured as the full URL (`https:\u002F\u002Fhost\u002Fpath`). Exact-matching `\u002Fpath` will never hit.\n- Audience filters (desktop-only, geo, cohort). Verify they use person properties or group properties — not URL.\n- Rollout percentage and any super-conditions.\n- `ensure_experience_continuity` setting on the flag (this overrides the experiment-level setting).\n\n## Step 3 — verify exposure is happening\n\nPull `$feature_flag_called` events for the flag key since the experiment start date.\n\n- Total count. If suspiciously low for the time elapsed, dig.\n- Break down by `$feature_flag_response`. Should split close to 50\u002F50 between the variant names (e.g. `control` \u002F `test`). Flag a **sample ratio mismatch** if imbalance exceeds ~5% with non-trivial volume.\n- If `$feature_flag_response` returns `false` for most events, the user isn't being bucketed into the experiment at all — the release condition is rejecting them. This is the most common cause of \"experiment shows 0 exposures.\"\n- Spot-check 5 raw event rows. Note the `$current_url`, `$device_type`, `$feature_flag`, `$feature_flag_response`, and `distinct_id`.\n\n## Step 4 — verify downstream attribution\n\nFor each metric event (CTA click, signup page visit, signup completion, conversion):\n\n- Pull sample rows and confirm they carry the `$feature\u002F\u003Cflag-key>` property with a real variant value (`control` or `test`), not `false` or missing.\n- Action-based metrics: check the action filters. If the variant renders different DOM IDs, the action must match all of them or one variant will artificially show 0 events. Action URL filters should match the production page, not a dev preview.\n- Metric scoping: if the metric is too broad (e.g. \"any `$pageview` containing `\u002Fsignup`\"), it will credit both variants for global traffic regardless of source. Suggest scoping by `$feature\u002F\u003Cflag-key>` property or session entry pathname.\n\n## Step 5 — verify identity continuity\n\nCross-domain handoff (Webflow → app, marketing → product, etc.) is where attribution usually dies.\n\n- Pick 5–10 users who reached the final funnel step (e.g. signup completion). Pull their event timeline.\n- Confirm they have a prior `$feature_flag_called` event with a real variant value.\n- Confirm `$identify` fires on the handoff. If users never have an `$identify` event, the anonymous device profile never stitches to the authenticated user — variant attribution is dead even with a perfectly fired flag.\n- Confirm bucketing key + `ensure_experience_continuity` settings together don't cause re-bucketing. `device_id` bucketing without continuity = same user on a new device looks fresh.\n\n## Step 6 — downstream conversion metric (trial activation \u002F purchase \u002F etc.)\n\nCustomers often have a primary conversion event that lives downstream (in their app or warehouse).\n\n- Search the event schema for the expected event name. Try several variants (`plus_trial_activated`, `trial_started`, `subscription_created`).\n- If not present, look for warehouse sources via `external-data-sources-list`. Common pattern: Snowflake\u002FPostgres table like `accounts.trial_started_at`.\n- Recommend the cleaner path: emit a server-side event from the app on activation. Easier than warehouse joins, faster signal, no schema fragility.\n- Alternative: use the warehouse table as an experiment metric directly (supported for funnel + trend metrics).\n\n## Step 7 — common pitfalls to call out (regardless of what you found)\n\nThe customer's actual setup almost always has one of these:\n\n- Person-property URL targeting (always wrong for this use case)\n- Exact-match operators on full-URL person properties (never hit)\n- Action metrics tied to dev URLs\u002Fselectors that won't fire on prod\n- Global metrics (\"any signup completion\") that credit both variants equally\n- Missing `$identify` on the marketing → product domain handoff\n- `device_id` bucketing without `ensure_experience_continuity` → re-bucketing across sessions\n- Default 14-day conversion window too short for downstream conversion events\n- Internal\u002Ftest user filter not configured → QA traffic skews early days\n- Sanity check exposure within 24h of launch — a 50\u002F50 that shows \u003C10 events in a week is a wiring bug, not a power problem\n\n## Output format\n\nGroup the report by the four standard customer questions. Lead with the worst finding:\n\n```\n:warning: [Experiment name] — audit findings\n\n[One-paragraph TL;DR of the headline finding. Be direct.]\n\n---\n(a) Does the config look correct?\n[Verdict + specific issues with evidence — event counts, sample values, etc.]\n\n---\n(b) How to verify attribution (once issues are fixed)\n[Concrete steps the customer can run themselves.]\n\n---\n(c) What to change about attribution\n[Numbered action list, priority order. Each item should be specific\nenough that the customer's engineer can act on it directly.]\n\n---\n(d) Common pitfalls to watch for\n[Subset of step 7's checklist relevant to this customer's setup.\nFrame as general guidance, not as accusations.]\n\n---\nBottom line: [one or two sentences. What's the single most important\nfix that unblocks the experiment?]\n```\n\n## Rules\n\n- **Read-only.** Do not create insights, dashboards, actions, experiments, or modify any config. You are impersonating the customer's user — any writes land in their actual project.\n- **No fabrication.** If you can't find the experiment or the data is empty, say so explicitly. Do not invent findings to fill the template.\n- **Cite real numbers.** Every claim about exposure counts, sample ratios, or event volumes must come from a query you actually ran in this session.\n- **Surface ambiguity.** If a setting could be intentional (e.g. low conversion window because conversion happens fast), note both interpretations and ask the customer to confirm.\n- **Match the customer's writing register.** Customers using PostHog are usually technical — don't oversimplify. But avoid jargon shorthand they may not know yet.\n\n## When the audit is done\n\nRemind the user to:\n1. Exit Claude Code\n2. Log out of Django Admin impersonation in their browser\n3. Optionally disable the posthog plugin: `claude plugin disable posthog`\n\nThe `impersonate-audit.sh` wrapper handles step 3 prompts automatically on exit.\n",{"data":41,"body":42},{"name":4,"description":6},{"type":43,"children":44},"root",[45,53,59,66,79,88,102,108,129,209,215,220,321,327,339,443,449,454,524,530,535,594,600,605,665,671,676,743,749,754,766,772,825,831,836,860],{"type":46,"tag":47,"props":48,"children":49},"element","h1",{"id":4},[50],{"type":51,"value":52},"text","Experiment Audit",{"type":46,"tag":54,"props":55,"children":56},"p",{},[57],{"type":51,"value":58},"Verify that a customer's experiment is actually collecting variant data, that downstream attribution survives the funnel, and that the metrics measure what the customer thinks they measure. Output is a Slack-ready writeup grouped by the four questions customers almost always ask.",{"type":46,"tag":60,"props":61,"children":63},"h2",{"id":62},"step-0-confirm-scope-before-running",[64],{"type":51,"value":65},"Step 0 — confirm scope before running",{"type":46,"tag":54,"props":67,"children":68},{},[69,71,77],{"type":51,"value":70},"The skill assumes the active PostHog MCP is scoped to the ",{"type":46,"tag":72,"props":73,"children":74},"strong",{},[75],{"type":51,"value":76},"customer's",{"type":51,"value":78}," project, not yours. Always start with:",{"type":46,"tag":80,"props":81,"children":82},"blockquote",{},[83],{"type":46,"tag":54,"props":84,"children":85},{},[86],{"type":51,"value":87},"\"What project am I in? List the most recent 5 experiments.\"",{"type":46,"tag":54,"props":89,"children":90},{},[91,93,100],{"type":51,"value":92},"If the project name looks like your own internal project (e.g. \"PostHog App + Website\", id 2), STOP — the impersonation isn't routing correctly. Re-run the wizard or check ",{"type":46,"tag":94,"props":95,"children":97},"code",{"className":96},[],[98],{"type":51,"value":99},"\u002Fmcp",{"type":51,"value":101}," auth before continuing.",{"type":46,"tag":60,"props":103,"children":105},{"id":104},"step-1-pull-the-experiment-config",[106],{"type":51,"value":107},"Step 1 — pull the experiment config",{"type":46,"tag":54,"props":109,"children":110},{},[111,113,119,121,127],{"type":51,"value":112},"Use ",{"type":46,"tag":94,"props":114,"children":116},{"className":115},[],[117],{"type":51,"value":118},"experiment-list",{"type":51,"value":120}," with ",{"type":46,"tag":94,"props":122,"children":124},{"className":123},[],[125],{"type":51,"value":126},"search",{"type":51,"value":128}," to find the experiment by name. Then pull the full record. Capture:",{"type":46,"tag":130,"props":131,"children":132},"ul",{},[133,139,144,157,186,199,204],{"type":46,"tag":134,"props":135,"children":136},"li",{},[137],{"type":51,"value":138},"Status (running \u002F draft \u002F stopped \u002F paused) and start date.",{"type":46,"tag":134,"props":140,"children":141},{},[142],{"type":51,"value":143},"Linked feature flag key and ID.",{"type":46,"tag":134,"props":145,"children":146},{},[147,149,155],{"type":51,"value":148},"Variants and traffic split. Variant ",{"type":46,"tag":150,"props":151,"children":152},"em",{},[153],{"type":51,"value":154},"names",{"type":51,"value":156}," must match what the customer's code reads — bucketing bugs are usually case\u002Ftypo mismatches.",{"type":46,"tag":134,"props":158,"children":159},{},[160,162,168,170,176,178,184],{"type":51,"value":161},"Holdout, bucketing key (",{"type":46,"tag":94,"props":163,"children":165},{"className":164},[],[166],{"type":51,"value":167},"device_id",{"type":51,"value":169}," vs ",{"type":46,"tag":94,"props":171,"children":173},{"className":172},[],[174],{"type":51,"value":175},"user_id",{"type":51,"value":177},"), and ",{"type":46,"tag":94,"props":179,"children":181},{"className":180},[],[182],{"type":51,"value":183},"ensure_experience_continuity",{"type":51,"value":185},".",{"type":46,"tag":134,"props":187,"children":188},{},[189,191,197],{"type":51,"value":190},"Exposure event — default ",{"type":46,"tag":94,"props":192,"children":194},{"className":193},[],[195],{"type":51,"value":196},"$feature_flag_called",{"type":51,"value":198}," or a custom event.",{"type":46,"tag":134,"props":200,"children":201},{},[202],{"type":51,"value":203},"Primary and secondary metrics. Note action IDs, event names, breakdowns, conversion windows, attribution modes.",{"type":46,"tag":134,"props":205,"children":206},{},[207],{"type":51,"value":208},"Filter test accounts setting.",{"type":46,"tag":60,"props":210,"children":212},{"id":211},"step-2-pull-the-feature-flag-config",[213],{"type":51,"value":214},"Step 2 — pull the feature flag config",{"type":46,"tag":54,"props":216,"children":217},{},[218],{"type":51,"value":219},"For the linked flag:",{"type":46,"tag":130,"props":221,"children":222},{},[223,228,301,306,311],{"type":46,"tag":134,"props":224,"children":225},{},[226],{"type":51,"value":227},"Release conditions — read each one carefully.",{"type":46,"tag":134,"props":229,"children":230},{},[231,236,238],{"type":46,"tag":72,"props":232,"children":233},{},[234],{"type":51,"value":235},"Watch for two specific footguns",{"type":51,"value":237},":\n",{"type":46,"tag":239,"props":240,"children":241},"ol",{},[242,267],{"type":46,"tag":134,"props":243,"children":244},{},[245,250,252,258,260,265],{"type":46,"tag":72,"props":246,"children":247},{},[248],{"type":51,"value":249},"URL targeting via person property",{"type":51,"value":251}," (",{"type":46,"tag":94,"props":253,"children":255},{"className":254},[],[256],{"type":51,"value":257},"$current_url = ...",{"type":51,"value":259},") — uses the ",{"type":46,"tag":150,"props":261,"children":262},{},[263],{"type":51,"value":264},"latest URL the person has been seen on",{"type":51,"value":266},", not the current page. Stale by definition. Always flag as a problem.",{"type":46,"tag":134,"props":268,"children":269},{},[270,275,277,283,285,291,293,299],{"type":46,"tag":72,"props":271,"children":272},{},[273],{"type":51,"value":274},"Exact-match on a path fragment",{"type":51,"value":276}," — ",{"type":46,"tag":94,"props":278,"children":280},{"className":279},[],[281],{"type":51,"value":282},"$current_url",{"type":51,"value":284}," is captured as the full URL (",{"type":46,"tag":94,"props":286,"children":288},{"className":287},[],[289],{"type":51,"value":290},"https:\u002F\u002Fhost\u002Fpath",{"type":51,"value":292},"). Exact-matching ",{"type":46,"tag":94,"props":294,"children":296},{"className":295},[],[297],{"type":51,"value":298},"\u002Fpath",{"type":51,"value":300}," will never hit.",{"type":46,"tag":134,"props":302,"children":303},{},[304],{"type":51,"value":305},"Audience filters (desktop-only, geo, cohort). Verify they use person properties or group properties — not URL.",{"type":46,"tag":134,"props":307,"children":308},{},[309],{"type":51,"value":310},"Rollout percentage and any super-conditions.",{"type":46,"tag":134,"props":312,"children":313},{},[314,319],{"type":46,"tag":94,"props":315,"children":317},{"className":316},[],[318],{"type":51,"value":183},{"type":51,"value":320}," setting on the flag (this overrides the experiment-level setting).",{"type":46,"tag":60,"props":322,"children":324},{"id":323},"step-3-verify-exposure-is-happening",[325],{"type":51,"value":326},"Step 3 — verify exposure is happening",{"type":46,"tag":54,"props":328,"children":329},{},[330,332,337],{"type":51,"value":331},"Pull ",{"type":46,"tag":94,"props":333,"children":335},{"className":334},[],[336],{"type":51,"value":196},{"type":51,"value":338}," events for the flag key since the experiment start date.",{"type":46,"tag":130,"props":340,"children":341},{},[342,347,383,403],{"type":46,"tag":134,"props":343,"children":344},{},[345],{"type":51,"value":346},"Total count. If suspiciously low for the time elapsed, dig.",{"type":46,"tag":134,"props":348,"children":349},{},[350,352,358,360,366,368,374,376,381],{"type":51,"value":351},"Break down by ",{"type":46,"tag":94,"props":353,"children":355},{"className":354},[],[356],{"type":51,"value":357},"$feature_flag_response",{"type":51,"value":359},". Should split close to 50\u002F50 between the variant names (e.g. ",{"type":46,"tag":94,"props":361,"children":363},{"className":362},[],[364],{"type":51,"value":365},"control",{"type":51,"value":367}," \u002F ",{"type":46,"tag":94,"props":369,"children":371},{"className":370},[],[372],{"type":51,"value":373},"test",{"type":51,"value":375},"). Flag a ",{"type":46,"tag":72,"props":377,"children":378},{},[379],{"type":51,"value":380},"sample ratio mismatch",{"type":51,"value":382}," if imbalance exceeds ~5% with non-trivial volume.",{"type":46,"tag":134,"props":384,"children":385},{},[386,388,393,395,401],{"type":51,"value":387},"If ",{"type":46,"tag":94,"props":389,"children":391},{"className":390},[],[392],{"type":51,"value":357},{"type":51,"value":394}," returns ",{"type":46,"tag":94,"props":396,"children":398},{"className":397},[],[399],{"type":51,"value":400},"false",{"type":51,"value":402}," for most events, the user isn't being bucketed into the experiment at all — the release condition is rejecting them. This is the most common cause of \"experiment shows 0 exposures.\"",{"type":46,"tag":134,"props":404,"children":405},{},[406,408,413,415,421,422,428,429,434,436,442],{"type":51,"value":407},"Spot-check 5 raw event rows. Note the ",{"type":46,"tag":94,"props":409,"children":411},{"className":410},[],[412],{"type":51,"value":282},{"type":51,"value":414},", ",{"type":46,"tag":94,"props":416,"children":418},{"className":417},[],[419],{"type":51,"value":420},"$device_type",{"type":51,"value":414},{"type":46,"tag":94,"props":423,"children":425},{"className":424},[],[426],{"type":51,"value":427},"$feature_flag",{"type":51,"value":414},{"type":46,"tag":94,"props":430,"children":432},{"className":431},[],[433],{"type":51,"value":357},{"type":51,"value":435},", and ",{"type":46,"tag":94,"props":437,"children":439},{"className":438},[],[440],{"type":51,"value":441},"distinct_id",{"type":51,"value":185},{"type":46,"tag":60,"props":444,"children":446},{"id":445},"step-4-verify-downstream-attribution",[447],{"type":51,"value":448},"Step 4 — verify downstream attribution",{"type":46,"tag":54,"props":450,"children":451},{},[452],{"type":51,"value":453},"For each metric event (CTA click, signup page visit, signup completion, conversion):",{"type":46,"tag":130,"props":455,"children":456},{},[457,491,496],{"type":46,"tag":134,"props":458,"children":459},{},[460,462,468,470,475,477,482,484,489],{"type":51,"value":461},"Pull sample rows and confirm they carry the ",{"type":46,"tag":94,"props":463,"children":465},{"className":464},[],[466],{"type":51,"value":467},"$feature\u002F\u003Cflag-key>",{"type":51,"value":469}," property with a real variant value (",{"type":46,"tag":94,"props":471,"children":473},{"className":472},[],[474],{"type":51,"value":365},{"type":51,"value":476}," or ",{"type":46,"tag":94,"props":478,"children":480},{"className":479},[],[481],{"type":51,"value":373},{"type":51,"value":483},"), not ",{"type":46,"tag":94,"props":485,"children":487},{"className":486},[],[488],{"type":51,"value":400},{"type":51,"value":490}," or missing.",{"type":46,"tag":134,"props":492,"children":493},{},[494],{"type":51,"value":495},"Action-based metrics: check the action filters. If the variant renders different DOM IDs, the action must match all of them or one variant will artificially show 0 events. Action URL filters should match the production page, not a dev preview.",{"type":46,"tag":134,"props":497,"children":498},{},[499,501,507,509,515,517,522],{"type":51,"value":500},"Metric scoping: if the metric is too broad (e.g. \"any ",{"type":46,"tag":94,"props":502,"children":504},{"className":503},[],[505],{"type":51,"value":506},"$pageview",{"type":51,"value":508}," containing ",{"type":46,"tag":94,"props":510,"children":512},{"className":511},[],[513],{"type":51,"value":514},"\u002Fsignup",{"type":51,"value":516},"\"), it will credit both variants for global traffic regardless of source. Suggest scoping by ",{"type":46,"tag":94,"props":518,"children":520},{"className":519},[],[521],{"type":51,"value":467},{"type":51,"value":523}," property or session entry pathname.",{"type":46,"tag":60,"props":525,"children":527},{"id":526},"step-5-verify-identity-continuity",[528],{"type":51,"value":529},"Step 5 — verify identity continuity",{"type":46,"tag":54,"props":531,"children":532},{},[533],{"type":51,"value":534},"Cross-domain handoff (Webflow → app, marketing → product, etc.) is where attribution usually dies.",{"type":46,"tag":130,"props":536,"children":537},{},[538,543,555,575],{"type":46,"tag":134,"props":539,"children":540},{},[541],{"type":51,"value":542},"Pick 5–10 users who reached the final funnel step (e.g. signup completion). Pull their event timeline.",{"type":46,"tag":134,"props":544,"children":545},{},[546,548,553],{"type":51,"value":547},"Confirm they have a prior ",{"type":46,"tag":94,"props":549,"children":551},{"className":550},[],[552],{"type":51,"value":196},{"type":51,"value":554}," event with a real variant value.",{"type":46,"tag":134,"props":556,"children":557},{},[558,560,566,568,573],{"type":51,"value":559},"Confirm ",{"type":46,"tag":94,"props":561,"children":563},{"className":562},[],[564],{"type":51,"value":565},"$identify",{"type":51,"value":567}," fires on the handoff. If users never have an ",{"type":46,"tag":94,"props":569,"children":571},{"className":570},[],[572],{"type":51,"value":565},{"type":51,"value":574}," event, the anonymous device profile never stitches to the authenticated user — variant attribution is dead even with a perfectly fired flag.",{"type":46,"tag":134,"props":576,"children":577},{},[578,580,585,587,592],{"type":51,"value":579},"Confirm bucketing key + ",{"type":46,"tag":94,"props":581,"children":583},{"className":582},[],[584],{"type":51,"value":183},{"type":51,"value":586}," settings together don't cause re-bucketing. ",{"type":46,"tag":94,"props":588,"children":590},{"className":589},[],[591],{"type":51,"value":167},{"type":51,"value":593}," bucketing without continuity = same user on a new device looks fresh.",{"type":46,"tag":60,"props":595,"children":597},{"id":596},"step-6-downstream-conversion-metric-trial-activation-purchase-etc",[598],{"type":51,"value":599},"Step 6 — downstream conversion metric (trial activation \u002F purchase \u002F etc.)",{"type":46,"tag":54,"props":601,"children":602},{},[603],{"type":51,"value":604},"Customers often have a primary conversion event that lives downstream (in their app or warehouse).",{"type":46,"tag":130,"props":606,"children":607},{},[608,635,655,660],{"type":46,"tag":134,"props":609,"children":610},{},[611,613,619,620,626,627,633],{"type":51,"value":612},"Search the event schema for the expected event name. Try several variants (",{"type":46,"tag":94,"props":614,"children":616},{"className":615},[],[617],{"type":51,"value":618},"plus_trial_activated",{"type":51,"value":414},{"type":46,"tag":94,"props":621,"children":623},{"className":622},[],[624],{"type":51,"value":625},"trial_started",{"type":51,"value":414},{"type":46,"tag":94,"props":628,"children":630},{"className":629},[],[631],{"type":51,"value":632},"subscription_created",{"type":51,"value":634},").",{"type":46,"tag":134,"props":636,"children":637},{},[638,640,646,648,654],{"type":51,"value":639},"If not present, look for warehouse sources via ",{"type":46,"tag":94,"props":641,"children":643},{"className":642},[],[644],{"type":51,"value":645},"external-data-sources-list",{"type":51,"value":647},". Common pattern: Snowflake\u002FPostgres table like ",{"type":46,"tag":94,"props":649,"children":651},{"className":650},[],[652],{"type":51,"value":653},"accounts.trial_started_at",{"type":51,"value":185},{"type":46,"tag":134,"props":656,"children":657},{},[658],{"type":51,"value":659},"Recommend the cleaner path: emit a server-side event from the app on activation. Easier than warehouse joins, faster signal, no schema fragility.",{"type":46,"tag":134,"props":661,"children":662},{},[663],{"type":51,"value":664},"Alternative: use the warehouse table as an experiment metric directly (supported for funnel + trend metrics).",{"type":46,"tag":60,"props":666,"children":668},{"id":667},"step-7-common-pitfalls-to-call-out-regardless-of-what-you-found",[669],{"type":51,"value":670},"Step 7 — common pitfalls to call out (regardless of what you found)",{"type":46,"tag":54,"props":672,"children":673},{},[674],{"type":51,"value":675},"The customer's actual setup almost always has one of these:",{"type":46,"tag":130,"props":677,"children":678},{},[679,684,689,694,699,711,728,733,738],{"type":46,"tag":134,"props":680,"children":681},{},[682],{"type":51,"value":683},"Person-property URL targeting (always wrong for this use case)",{"type":46,"tag":134,"props":685,"children":686},{},[687],{"type":51,"value":688},"Exact-match operators on full-URL person properties (never hit)",{"type":46,"tag":134,"props":690,"children":691},{},[692],{"type":51,"value":693},"Action metrics tied to dev URLs\u002Fselectors that won't fire on prod",{"type":46,"tag":134,"props":695,"children":696},{},[697],{"type":51,"value":698},"Global metrics (\"any signup completion\") that credit both variants equally",{"type":46,"tag":134,"props":700,"children":701},{},[702,704,709],{"type":51,"value":703},"Missing ",{"type":46,"tag":94,"props":705,"children":707},{"className":706},[],[708],{"type":51,"value":565},{"type":51,"value":710}," on the marketing → product domain handoff",{"type":46,"tag":134,"props":712,"children":713},{},[714,719,721,726],{"type":46,"tag":94,"props":715,"children":717},{"className":716},[],[718],{"type":51,"value":167},{"type":51,"value":720}," bucketing without ",{"type":46,"tag":94,"props":722,"children":724},{"className":723},[],[725],{"type":51,"value":183},{"type":51,"value":727}," → re-bucketing across sessions",{"type":46,"tag":134,"props":729,"children":730},{},[731],{"type":51,"value":732},"Default 14-day conversion window too short for downstream conversion events",{"type":46,"tag":134,"props":734,"children":735},{},[736],{"type":51,"value":737},"Internal\u002Ftest user filter not configured → QA traffic skews early days",{"type":46,"tag":134,"props":739,"children":740},{},[741],{"type":51,"value":742},"Sanity check exposure within 24h of launch — a 50\u002F50 that shows \u003C10 events in a week is a wiring bug, not a power problem",{"type":46,"tag":60,"props":744,"children":746},{"id":745},"output-format",[747],{"type":51,"value":748},"Output format",{"type":46,"tag":54,"props":750,"children":751},{},[752],{"type":51,"value":753},"Group the report by the four standard customer questions. Lead with the worst finding:",{"type":46,"tag":755,"props":756,"children":760},"pre",{"className":757,"code":759,"language":51},[758],"language-text",":warning: [Experiment name] — audit findings\n\n[One-paragraph TL;DR of the headline finding. Be direct.]\n\n---\n(a) Does the config look correct?\n[Verdict + specific issues with evidence — event counts, sample values, etc.]\n\n---\n(b) How to verify attribution (once issues are fixed)\n[Concrete steps the customer can run themselves.]\n\n---\n(c) What to change about attribution\n[Numbered action list, priority order. Each item should be specific\nenough that the customer's engineer can act on it directly.]\n\n---\n(d) Common pitfalls to watch for\n[Subset of step 7's checklist relevant to this customer's setup.\nFrame as general guidance, not as accusations.]\n\n---\nBottom line: [one or two sentences. What's the single most important\nfix that unblocks the experiment?]\n",[761],{"type":46,"tag":94,"props":762,"children":764},{"__ignoreMap":763},"",[765],{"type":51,"value":759},{"type":46,"tag":60,"props":767,"children":769},{"id":768},"rules",[770],{"type":51,"value":771},"Rules",{"type":46,"tag":130,"props":773,"children":774},{},[775,785,795,805,815],{"type":46,"tag":134,"props":776,"children":777},{},[778,783],{"type":46,"tag":72,"props":779,"children":780},{},[781],{"type":51,"value":782},"Read-only.",{"type":51,"value":784}," Do not create insights, dashboards, actions, experiments, or modify any config. You are impersonating the customer's user — any writes land in their actual project.",{"type":46,"tag":134,"props":786,"children":787},{},[788,793],{"type":46,"tag":72,"props":789,"children":790},{},[791],{"type":51,"value":792},"No fabrication.",{"type":51,"value":794}," If you can't find the experiment or the data is empty, say so explicitly. Do not invent findings to fill the template.",{"type":46,"tag":134,"props":796,"children":797},{},[798,803],{"type":46,"tag":72,"props":799,"children":800},{},[801],{"type":51,"value":802},"Cite real numbers.",{"type":51,"value":804}," Every claim about exposure counts, sample ratios, or event volumes must come from a query you actually ran in this session.",{"type":46,"tag":134,"props":806,"children":807},{},[808,813],{"type":46,"tag":72,"props":809,"children":810},{},[811],{"type":51,"value":812},"Surface ambiguity.",{"type":51,"value":814}," If a setting could be intentional (e.g. low conversion window because conversion happens fast), note both interpretations and ask the customer to confirm.",{"type":46,"tag":134,"props":816,"children":817},{},[818,823],{"type":46,"tag":72,"props":819,"children":820},{},[821],{"type":51,"value":822},"Match the customer's writing register.",{"type":51,"value":824}," Customers using PostHog are usually technical — don't oversimplify. But avoid jargon shorthand they may not know yet.",{"type":46,"tag":60,"props":826,"children":828},{"id":827},"when-the-audit-is-done",[829],{"type":51,"value":830},"When the audit is done",{"type":46,"tag":54,"props":832,"children":833},{},[834],{"type":51,"value":835},"Remind the user to:",{"type":46,"tag":239,"props":837,"children":838},{},[839,844,849],{"type":46,"tag":134,"props":840,"children":841},{},[842],{"type":51,"value":843},"Exit Claude Code",{"type":46,"tag":134,"props":845,"children":846},{},[847],{"type":51,"value":848},"Log out of Django Admin impersonation in their browser",{"type":46,"tag":134,"props":850,"children":851},{},[852,854],{"type":51,"value":853},"Optionally disable the posthog plugin: ",{"type":46,"tag":94,"props":855,"children":857},{"className":856},[],[858],{"type":51,"value":859},"claude plugin disable posthog",{"type":46,"tag":54,"props":861,"children":862},{},[863,865,871],{"type":51,"value":864},"The ",{"type":46,"tag":94,"props":866,"children":868},{"className":867},[],[869],{"type":51,"value":870},"impersonate-audit.sh",{"type":51,"value":872}," wrapper handles step 3 prompts automatically on exit.",{"items":874,"total":981},[875,892,910,924,940,954,965],{"slug":876,"name":876,"fn":877,"description":878,"org":879,"tags":880,"stars":29,"repoUrl":30,"updatedAt":891},"account-handover","draft sales account handover notes","Draft structured handover notes for transitioning a PostHog account from one TAM or CSM to another. Use this skill when a TAM needs to hand over an account, prepare a transition briefing, write handover notes, create an account summary for a new owner, or any request involving account transitions between TAMs or CSMs. Triggers on \"hand over this account\", \"transition account to\", \"draft handover notes\", \"account briefing for new TAM\", \"prepare account transition\", or when a TAM names an account and says they're leaving or reassigning it.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[881,884,887,888],{"name":882,"slug":883,"type":13},"Communications","communications",{"name":885,"slug":886,"type":13},"CRM","crm",{"name":9,"slug":8,"type":13},{"name":889,"slug":890,"type":13},"Sales","sales","2026-04-16T05:13:00.172732",{"slug":893,"name":893,"fn":894,"description":895,"org":896,"tags":897,"stars":29,"repoUrl":30,"updatedAt":909},"auditing-warehouse-data-health","audit PostHog data warehouse health","Audit the health of a PostHog project's data warehouse — find every broken or degraded pipeline item across sources, sync schemas, materialized views, batch exports, and transformations. Use when the user asks \"what's broken in my warehouse?\", \"give me a health check\", \"audit my data pipeline\", \"why are some dashboards stale?\", or wants a one-shot triage summary before deciding where to spend time. Produces a prioritized report of issues grouped by severity and type, with recommended next steps.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[898,899,902,905,908],{"name":15,"slug":16,"type":13},{"name":900,"slug":901,"type":13},"Data Engineering","data-engineering",{"name":903,"slug":904,"type":13},"Data Quality","data-quality",{"name":906,"slug":907,"type":13},"Observability","observability",{"name":9,"slug":8,"type":13},"2026-06-21T08:19:05.85849",{"slug":911,"name":911,"fn":912,"description":913,"org":914,"tags":915,"stars":29,"repoUrl":30,"updatedAt":923},"copying-flags-across-projects","copy feature flags across PostHog projects","Copy a feature flag from one PostHog project to one or more target projects in the same organization. Use when the user wants to duplicate a flag, promote a flag from staging to production, sync flags across projects, or replicate a flag configuration in a different workspace. Covers cohort remapping, scheduled-change handling, encrypted payloads, and the safe defaults (disabled in target, no scheduled changes).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[916,919,922],{"name":917,"slug":918,"type":13},"Deployment","deployment",{"name":920,"slug":921,"type":13},"Feature Flags","feature-flags",{"name":9,"slug":8,"type":13},"2026-05-04T05:56:44.484909",{"slug":925,"name":925,"fn":926,"description":927,"org":928,"tags":929,"stars":29,"repoUrl":30,"updatedAt":939},"diagnosing-experiment-results","diagnose PostHog experiment results and anomalies","Diagnoses bias, anomalies, and strange-looking results on a specific PostHog experiment. Covers empty \u002F 0-exposure experiments, sample ratio mismatch, identity fragmentation, multi-variant exposure, uneven-split exclusion bias, significance traps (peeking, A\u002FA, Bayesian vs Frequentist), PostHog-vs-SQL discrepancies, and surprises after mid-run edits. Symptom-driven dispatch to the right diagnostic.\nTRIGGER when: user asks 'is my experiment biased?' or 'why 0 exposures?', references the bias banner, says a variant looks strange \u002F wrong \u002F off, sees significance flipping, notices PostHog numbers disagreeing with their SQL, sees an A\u002FA test showing significance, or reports surprises after mid-run edits.\nDO NOT TRIGGER when: creating a new experiment (use creating-experiments), only configuring rollout (use configuring-experiment-rollout) or metrics (use configuring-experiment-analytics), or only asking lifecycle questions (use managing-experiment-lifecycle).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[930,931,932,935,938],{"name":27,"slug":28,"type":13},{"name":24,"slug":25,"type":13},{"name":933,"slug":934,"type":13},"Data Analysis","data-analysis",{"name":936,"slug":937,"type":13},"Debugging","debugging",{"name":9,"slug":8,"type":13},"2026-05-22T06:59:58.103867",{"slug":941,"name":941,"fn":942,"description":943,"org":944,"tags":945,"stars":29,"repoUrl":30,"updatedAt":953},"diagnosing-missing-recordings","diagnose missing PostHog session recordings","Diagnoses why a session recording is missing or was not captured. Use when a user asks why a session has no replay, why recordings aren't appearing, or wants to troubleshoot session replay capture issues for a specific session ID or across their project. Covers SDK diagnostic signals, project settings, sampling, triggers, ad blockers, and quota\u002Fbilling scenarios.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[946,947,948,951,952],{"name":24,"slug":25,"type":13},{"name":936,"slug":937,"type":13},{"name":949,"slug":950,"type":13},"Frontend","frontend",{"name":906,"slug":907,"type":13},{"name":9,"slug":8,"type":13},"2026-04-22T05:06:51.989772",{"slug":955,"name":955,"fn":956,"description":957,"org":958,"tags":959,"stars":29,"repoUrl":30,"updatedAt":964},"diagnosing-sdk-health","diagnose PostHog SDK health","Diagnoses the health of a project's PostHog SDK integrations — which SDKs are out of date and how to fix them. Use when a user asks about PostHog SDK versions, outdated SDKs, upgrade recommendations, \"SDK health\", \"SDK doctor\" (the former name), or when events or features seem off and it might be due to an old SDK.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[960,961,962,963],{"name":24,"slug":25,"type":13},{"name":936,"slug":937,"type":13},{"name":906,"slug":907,"type":13},{"name":9,"slug":8,"type":13},"2026-04-27T05:46:14.554016",{"slug":966,"name":966,"fn":967,"description":968,"org":969,"tags":970,"stars":29,"repoUrl":30,"updatedAt":980},"error-tracking-android","track Android errors with PostHog","PostHog error tracking for Android",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[971,974,975,978,979],{"name":972,"slug":973,"type":13},"Android","android",{"name":936,"slug":937,"type":13},{"name":976,"slug":977,"type":13},"Mobile","mobile",{"name":906,"slug":907,"type":13},{"name":9,"slug":8,"type":13},"2026-04-06T18:46:26.982494",110,{"items":983,"total":1146},[984,999,1009,1022,1035,1048,1064,1081,1093,1108,1118,1136],{"slug":985,"name":985,"fn":986,"description":987,"org":988,"tags":989,"stars":996,"repoUrl":997,"updatedAt":998},"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},[990,991,994,995],{"name":24,"slug":25,"type":13},{"name":992,"slug":993,"type":13},"Cost Optimization","cost-optimization",{"name":906,"slug":907,"type":13},{"name":9,"slug":8,"type":13},35568,"https:\u002F\u002Fgithub.com\u002FPostHog\u002Fposthog","2026-07-28T05:34:11.117757",{"slug":1000,"name":1000,"fn":1001,"description":1002,"org":1003,"tags":1004,"stars":996,"repoUrl":997,"updatedAt":1008},"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},[1005,1006,1007],{"name":24,"slug":25,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},"2026-06-08T08:08:33.693989",{"slug":1010,"name":1010,"fn":1011,"description":1012,"org":1013,"tags":1014,"stars":996,"repoUrl":997,"updatedAt":1021},"auditing-warehouse-source-health","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},[1015,1016,1019,1020],{"name":15,"slug":16,"type":13},{"name":1017,"slug":1018,"type":13},"Data Warehouse","data-warehouse",{"name":906,"slug":907,"type":13},{"name":9,"slug":8,"type":13},"2026-06-18T08:22:57.67984",{"slug":1023,"name":1023,"fn":1024,"description":1025,"org":1026,"tags":1027,"stars":996,"repoUrl":997,"updatedAt":1034},"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},[1028,1029,1030,1033],{"name":15,"slug":16,"type":13},{"name":1017,"slug":1018,"type":13},{"name":1031,"slug":1032,"type":13},"Performance","performance",{"name":9,"slug":8,"type":13},"2026-06-18T08:25:10.936787",{"slug":1036,"name":1036,"fn":1037,"description":1038,"org":1039,"tags":1040,"stars":996,"repoUrl":997,"updatedAt":1047},"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},[1041,1044,1045,1046],{"name":1042,"slug":1043,"type":13},"Alerting","alerting",{"name":936,"slug":937,"type":13},{"name":906,"slug":907,"type":13},{"name":9,"slug":8,"type":13},"2026-06-18T08:24:40.318583",{"slug":1049,"name":1049,"fn":1050,"description":1051,"org":1052,"tags":1053,"stars":996,"repoUrl":997,"updatedAt":1063},"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},[1054,1055,1058,1059,1062],{"name":24,"slug":25,"type":13},{"name":1056,"slug":1057,"type":13},"Monitoring","monitoring",{"name":906,"slug":907,"type":13},{"name":1060,"slug":1061,"type":13},"Operations","operations",{"name":9,"slug":8,"type":13},"2026-07-18T05:10:54.430898",{"slug":1065,"name":1065,"fn":1066,"description":1067,"org":1068,"tags":1069,"stars":996,"repoUrl":997,"updatedAt":1080},"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},[1070,1073,1076,1077],{"name":1071,"slug":1072,"type":13},"Automation","automation",{"name":1074,"slug":1075,"type":13},"MCP","mcp",{"name":9,"slug":8,"type":13},{"name":1078,"slug":1079,"type":13},"Workflow Automation","workflow-automation","2026-07-28T05:34:12.167015",{"slug":1082,"name":1082,"fn":1083,"description":1084,"org":1085,"tags":1086,"stars":996,"repoUrl":997,"updatedAt":1092},"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},[1087,1088,1089,1090,1091],{"name":24,"slug":25,"type":13},{"name":936,"slug":937,"type":13},{"name":949,"slug":950,"type":13},{"name":906,"slug":907,"type":13},{"name":9,"slug":8,"type":13},"2026-05-07T05:56:19.828048",{"slug":1094,"name":1094,"fn":1095,"description":1096,"org":1097,"tags":1098,"stars":996,"repoUrl":997,"updatedAt":1107},"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},[1099,1102,1103,1104],{"name":1100,"slug":1101,"type":13},"API Development","api-development",{"name":949,"slug":950,"type":13},{"name":9,"slug":8,"type":13},{"name":1105,"slug":1106,"type":13},"SDK","sdk","2026-06-08T08:08:34.929454",{"slug":1109,"name":1109,"fn":1110,"description":1111,"org":1112,"tags":1113,"stars":996,"repoUrl":997,"updatedAt":1117},"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},[1114,1115,1116],{"name":1100,"slug":1101,"type":13},{"name":1060,"slug":1061,"type":13},{"name":9,"slug":8,"type":13},"2026-07-15T05:29:58.442727",{"slug":1119,"name":1119,"fn":1120,"description":1121,"org":1122,"tags":1123,"stars":996,"repoUrl":997,"updatedAt":1135},"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},[1124,1125,1128,1129,1132],{"name":1071,"slug":1072,"type":13},{"name":1126,"slug":1127,"type":13},"Email","email",{"name":9,"slug":8,"type":13},{"name":1130,"slug":1131,"type":13},"Reporting","reporting",{"name":1133,"slug":1134,"type":13},"Slack","slack","2026-06-09T07:32:27.935712",{"slug":1137,"name":1137,"fn":1138,"description":1139,"org":1140,"tags":1141,"stars":996,"repoUrl":997,"updatedAt":1145},"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},[1142,1143,1144],{"name":24,"slug":25,"type":13},{"name":1100,"slug":1101,"type":13},{"name":9,"slug":8,"type":13},"2026-06-08T08:08:29.624498",231]