[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-posthog-authoring-error-tracking-alerts":3,"mdc--lzyixv-key":49,"related-repo-posthog-authoring-error-tracking-alerts":1743,"related-org-posthog-authoring-error-tracking-alerts":1837},{"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":44,"sourceUrl":47,"mdContent":48},"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},"posthog","PostHog","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fposthog.png",[12,16,19,20],{"name":13,"slug":14,"type":15},"Observability","observability","tag",{"name":17,"slug":18,"type":15},"Alerting","alerting",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Debugging","debugging",35568,"https:\u002F\u002Fgithub.com\u002FPostHog\u002Fposthog","2026-06-18T08:24:40.318583",null,2977,[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"ab-testing","ai-analytics","analytics","cdp","data-warehouse","experiments","feature-flags","javascript","product-analytics","python","react","session-replay","surveys","typescript","web-analytics",{"repoUrl":24,"stars":23,"forks":27,"topics":45,"description":46},[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"🦔 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\u002Ferror_tracking\u002Fskills\u002Fauthoring-error-tracking-alerts","---\nname: authoring-error-tracking-alerts\ndescription: >\n  Author error tracking alerts that fire when an issue is created, reopened, or starts spiking. Use when\n  the user asks to set up error notifications, route exceptions to Slack\u002Fwebhook\u002FLinear, or evaluate which\n  error events are worth alerting on. Covers trigger-event selection, integration choice, dedup against\n  existing alerts, and shipping with the canonical message body shape.\n---\n\n# Authoring error tracking alerts\n\nAuthoring an error tracking alert is a _routing_ problem, not a measurement problem. The trigger events\nalready exist and fire on real conditions in the ingestion pipeline — your job is to pick the right\ntrigger for the user's intent, dedupe against what's already configured, and wire a destination they can\nactually act on.\n\n## When to use this skill\n\n- The user asks to set up alerts \u002F notifications for errors or exceptions in their project.\n- The user wants a starter set of alerts after enabling error tracking.\n- The user pastes an issue link and asks \"notify me when this happens again\" — usually `_reopened` with a\n  per-issue property filter.\n\n## When _not_ to use this skill\n\n- Tuning the spike detector itself (multiplier, window, threshold). That lives behind the spike detection\n  config endpoint and is not exposed via MCP today.\n- Investigating an active incident — query the issue \u002F its events directly via\n  `posthog:query-error-tracking-issue` and `posthog:query-error-tracking-issue-events` instead of\n  authoring more alerts mid-fire.\n- Configuring volume-threshold alerts (count of `$exception` events over a window). That's a logs-style\n  alert and is not in scope here — error tracking alerts ride the lifecycle events instead.\n\n## Tools\n\n| Tool                                           | Job                                                              | Where it fits                |\n| ---------------------------------------------- | ---------------------------------------------------------------- | ---------------------------- |\n| `posthog:error-tracking-alerts-list`           | List existing alerts; dedupe before creating.                    | Step 2 — dedupe.             |\n| `posthog:integrations-list`                    | Find the user's Slack workspace id (filter by `kind=slack`).     | Step 3 — pick channel.       |\n| `posthog:integrations-channels-retrieve`       | List Slack channels for a workspace.                             | Step 3 — pick channel.       |\n| `posthog:error-tracking-alerts-create`         | Create the alert (HogFunction with `type=internal_destination`). | Step 4 — ship.               |\n| `posthog:error-tracking-alerts-partial-update` | Toggle, rename, or modify an existing alert.                     | When tuning, not authoring.  |\n| `posthog:error-tracking-alerts-delete`         | Soft-delete an alert.                                            | When the user says \"remove\". |\n\n## Trigger events — pick exactly one per alert\n\nThere are three lifecycle events. Each has a different \"noise vs urgency\" trade-off — picking the wrong\none is the most common cause of alert fatigue here.\n\n| Event                            | Fires when                                            | Use when                                                                                                                            |\n| -------------------------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |\n| `$error_tracking_issue_created`  | A brand-new issue first appears.                      | Small projects, or projects where every new error type is genuinely worth a look. Floods large\u002Fnoisy projects.                      |\n| `$error_tracking_issue_reopened` | A previously resolved issue starts emitting again.    | Catch regressions on issues someone already triaged. The safest \"I want to know if this comes back\" trigger.                        |\n| `$error_tracking_issue_spiking`  | The spike detector flags abnormal volume on an issue. | Production projects with high baseline volume. Threshold\u002Fmultiplier is shared across the project — check spike config before using. |\n\nIf the user is vague (\"alert me on errors\"), default to `_spiking`. It's the most signal-dense trigger\nand the least likely to cause alert fatigue. Confirm explicitly before proceeding.\n\n## Workflow\n\n### 1. Confirm intent\n\nYou need three things from the user before creating anything:\n\n- **Which trigger event.** If unspecified, recommend `_spiking` and ask for confirmation. Do not silently\n  pick one.\n- **Which channel.** Slack channel name, webhook URL, Linear team, etc. Never hardcode a production\n  channel. If the user says \"the dev channel\", ask for the exact channel id or name.\n- **Which scope.** All issues (most common), or scoped to a specific issue \u002F exception type \u002F assignee.\n\n### 2. Dedupe against existing alerts\n\nCall `posthog:error-tracking-alerts-list`. Filter the response client-side by `filters.events[].id`.\n\n- If an alert exists for the **same event** delivering to the **same channel**, stop. Tell the user it\n  already exists and ask whether they want to change anything (in which case use\n  `error-tracking-alerts-partial-update`) or skip.\n- Multiple alerts on the same event for the same channel produce duplicate Slack messages — the user\n  almost never wants this.\n- Multiple alerts on the same event for **different** channels (e.g. one for `#oncall`, one for the\n  oncall webhook) is fine and sometimes intentional. Confirm.\n\nPostHog's \"alerts configured\" recommendation only inspects `filters.events` — adding per-issue\n`filters.properties` does not affect the status the recommendations card reports.\n\n### 3. Pick the integration\n\nFor Slack:\n\n1. `posthog:integrations-list` with `kind=slack` → pick the integration `id` (an integer).\n2. `posthog:integrations-channels-retrieve` with that id → pick the channel id (e.g. `C0123ABC`). Channel\n   names like `\"#oncall\"` are accepted but channel ids are preferred — they survive renames.\n\nFor webhook: the user supplies a single `https:\u002F\u002F` URL. Refuse `http:\u002F\u002F` URLs.\n\nFor Linear \u002F GitHub \u002F GitLab: confirm the integration is connected via `posthog:integrations-list` first,\nthen ask the user which project \u002F repository \u002F team to file issues into.\n\n### 4. Create the alert\n\nCall `posthog:error-tracking-alerts-create` with:\n\n```json\n{\n  \"type\": \"internal_destination\",\n  \"template_id\": \"template-slack\",\n  \"name\": \"\u003Cshort, channel-attributed name>\",\n  \"enabled\": true,\n  \"filters\": {\n    \"events\": [{ \"id\": \"$error_tracking_issue_created\", \"type\": \"events\" }]\n  },\n  \"inputs\": {\n    \"slack_workspace\": { \"value\": \u003Cslack_integration_id_int> },\n    \"channel\": { \"value\": \"\u003Cchannel_id>\" },\n    \"text\": { \"value\": \"...\" },\n    \"blocks\": { \"value\": [...] }\n  }\n}\n```\n\nThe canonical Slack `blocks` payload for each event lives in\n[references\u002Fblock-templates.md](.\u002Freferences\u002Fblock-templates.md). Copy the matching block verbatim — it\nmatches the in-product alert wizard, so agent-created alerts look identical to UI-created ones.\n\nFor per-issue scoping — `created` \u002F `reopened` only, spiking events carry no exception properties — add\nto `filters`:\n\n```json\n\"properties\": [\n  { \"key\": \"$exception_issue_id\", \"value\": \"\u003Cissue_uuid>\", \"operator\": \"exact\", \"type\": \"event\" }\n]\n```\n\nOther useful property filters: `$exception_types` (exception class names, an array), `name` (issue\ntitle). See [references\u002Fevent-triggers.md](.\u002Freferences\u002Fevent-triggers.md) for the full property surface\nper event.\n\n### 5. Verify\n\nEcho the alert back to the user with: name, trigger event (human-readable), destination, and a one-line\npreview of the message body. Do not echo Slack workspace ids or webhook URLs — those are sensitive. Tell\nthe user how to disable: \"you can pause this alert by setting `enabled: false` via\n`error-tracking-alerts-partial-update` or by toggling it in the destinations UI.\"\n\n## Naming convention\n\nUse `\u003Ctrigger> · \u003Cchannel> (auto)` so the user can scan their alert list and spot agent-created entries.\nExamples:\n\n- `Issue spiking · #oncall (auto)`\n- `Issue reopened · #regressions-webhook (auto)`\n- `Issue created · Linear\u002FEng (auto)`\n\nDo not use the issue title in the name — alerts can match many issues, and the title becomes stale once\nthe issue evolves.\n\n## Token-economy rules\n\n- One `posthog:error-tracking-alerts-list` call up front, not per candidate.\n- Reuse a single integration lookup for multiple alerts going to the same workspace.\n- Confirm the channel \u002F URL with the user **before** creating each alert. Never batch-create alerts to a\n  destination the user has not explicitly named.\n- Cap iteration at 1 round per alert. If the user wants three alerts, that's three create calls — not\n  three create calls per alert.\n\n## Output\n\nReport what you did, in this shape:\n\n- For each shipped alert: name, trigger event, destination (channel name or webhook host — never the\n  full URL), enabled state.\n- For each skipped alert: trigger + channel + why (already exists, user declined, missing integration).\n- Anything the user should do next: enable the spike detection config (if they picked `_spiking` and the\n  detector hasn't been turned on), wire up source maps (so the alert's stack trace links resolve), or\n  tune the alert filters after watching it for a day.\n",{"data":50,"body":51},{"name":4,"description":6},{"type":52,"children":53},"root",[54,62,76,83,112,125,167,173,352,358,363,456,469,475,482,487,528,534,554,609,630,636,641,696,717,729,735,746,1319,1340,1367,1550,1578,1584,1604,1610,1623,1653,1658,1664,1701,1707,1712,1737],{"type":55,"tag":56,"props":57,"children":58},"element","h1",{"id":4},[59],{"type":60,"value":61},"text","Authoring error tracking alerts",{"type":55,"tag":63,"props":64,"children":65},"p",{},[66,68,74],{"type":60,"value":67},"Authoring an error tracking alert is a ",{"type":55,"tag":69,"props":70,"children":71},"em",{},[72],{"type":60,"value":73},"routing",{"type":60,"value":75}," problem, not a measurement problem. The trigger events\nalready exist and fire on real conditions in the ingestion pipeline — your job is to pick the right\ntrigger for the user's intent, dedupe against what's already configured, and wire a destination they can\nactually act on.",{"type":55,"tag":77,"props":78,"children":80},"h2",{"id":79},"when-to-use-this-skill",[81],{"type":60,"value":82},"When to use this skill",{"type":55,"tag":84,"props":85,"children":86},"ul",{},[87,93,98],{"type":55,"tag":88,"props":89,"children":90},"li",{},[91],{"type":60,"value":92},"The user asks to set up alerts \u002F notifications for errors or exceptions in their project.",{"type":55,"tag":88,"props":94,"children":95},{},[96],{"type":60,"value":97},"The user wants a starter set of alerts after enabling error tracking.",{"type":55,"tag":88,"props":99,"children":100},{},[101,103,110],{"type":60,"value":102},"The user pastes an issue link and asks \"notify me when this happens again\" — usually ",{"type":55,"tag":104,"props":105,"children":107},"code",{"className":106},[],[108],{"type":60,"value":109},"_reopened",{"type":60,"value":111}," with a\nper-issue property filter.",{"type":55,"tag":77,"props":113,"children":115},{"id":114},"when-not-to-use-this-skill",[116,118,123],{"type":60,"value":117},"When ",{"type":55,"tag":69,"props":119,"children":120},{},[121],{"type":60,"value":122},"not",{"type":60,"value":124}," to use this skill",{"type":55,"tag":84,"props":126,"children":127},{},[128,133,154],{"type":55,"tag":88,"props":129,"children":130},{},[131],{"type":60,"value":132},"Tuning the spike detector itself (multiplier, window, threshold). That lives behind the spike detection\nconfig endpoint and is not exposed via MCP today.",{"type":55,"tag":88,"props":134,"children":135},{},[136,138,144,146,152],{"type":60,"value":137},"Investigating an active incident — query the issue \u002F its events directly via\n",{"type":55,"tag":104,"props":139,"children":141},{"className":140},[],[142],{"type":60,"value":143},"posthog:query-error-tracking-issue",{"type":60,"value":145}," and ",{"type":55,"tag":104,"props":147,"children":149},{"className":148},[],[150],{"type":60,"value":151},"posthog:query-error-tracking-issue-events",{"type":60,"value":153}," instead of\nauthoring more alerts mid-fire.",{"type":55,"tag":88,"props":155,"children":156},{},[157,159,165],{"type":60,"value":158},"Configuring volume-threshold alerts (count of ",{"type":55,"tag":104,"props":160,"children":162},{"className":161},[],[163],{"type":60,"value":164},"$exception",{"type":60,"value":166}," events over a window). That's a logs-style\nalert and is not in scope here — error tracking alerts ride the lifecycle events instead.",{"type":55,"tag":77,"props":168,"children":170},{"id":169},"tools",[171],{"type":60,"value":172},"Tools",{"type":55,"tag":174,"props":175,"children":176},"table",{},[177,201],{"type":55,"tag":178,"props":179,"children":180},"thead",{},[181],{"type":55,"tag":182,"props":183,"children":184},"tr",{},[185,191,196],{"type":55,"tag":186,"props":187,"children":188},"th",{},[189],{"type":60,"value":190},"Tool",{"type":55,"tag":186,"props":192,"children":193},{},[194],{"type":60,"value":195},"Job",{"type":55,"tag":186,"props":197,"children":198},{},[199],{"type":60,"value":200},"Where it fits",{"type":55,"tag":202,"props":203,"children":204},"tbody",{},[205,228,258,279,308,330],{"type":55,"tag":182,"props":206,"children":207},{},[208,218,223],{"type":55,"tag":209,"props":210,"children":211},"td",{},[212],{"type":55,"tag":104,"props":213,"children":215},{"className":214},[],[216],{"type":60,"value":217},"posthog:error-tracking-alerts-list",{"type":55,"tag":209,"props":219,"children":220},{},[221],{"type":60,"value":222},"List existing alerts; dedupe before creating.",{"type":55,"tag":209,"props":224,"children":225},{},[226],{"type":60,"value":227},"Step 2 — dedupe.",{"type":55,"tag":182,"props":229,"children":230},{},[231,240,253],{"type":55,"tag":209,"props":232,"children":233},{},[234],{"type":55,"tag":104,"props":235,"children":237},{"className":236},[],[238],{"type":60,"value":239},"posthog:integrations-list",{"type":55,"tag":209,"props":241,"children":242},{},[243,245,251],{"type":60,"value":244},"Find the user's Slack workspace id (filter by ",{"type":55,"tag":104,"props":246,"children":248},{"className":247},[],[249],{"type":60,"value":250},"kind=slack",{"type":60,"value":252},").",{"type":55,"tag":209,"props":254,"children":255},{},[256],{"type":60,"value":257},"Step 3 — pick channel.",{"type":55,"tag":182,"props":259,"children":260},{},[261,270,275],{"type":55,"tag":209,"props":262,"children":263},{},[264],{"type":55,"tag":104,"props":265,"children":267},{"className":266},[],[268],{"type":60,"value":269},"posthog:integrations-channels-retrieve",{"type":55,"tag":209,"props":271,"children":272},{},[273],{"type":60,"value":274},"List Slack channels for a workspace.",{"type":55,"tag":209,"props":276,"children":277},{},[278],{"type":60,"value":257},{"type":55,"tag":182,"props":280,"children":281},{},[282,291,303],{"type":55,"tag":209,"props":283,"children":284},{},[285],{"type":55,"tag":104,"props":286,"children":288},{"className":287},[],[289],{"type":60,"value":290},"posthog:error-tracking-alerts-create",{"type":55,"tag":209,"props":292,"children":293},{},[294,296,302],{"type":60,"value":295},"Create the alert (HogFunction with ",{"type":55,"tag":104,"props":297,"children":299},{"className":298},[],[300],{"type":60,"value":301},"type=internal_destination",{"type":60,"value":252},{"type":55,"tag":209,"props":304,"children":305},{},[306],{"type":60,"value":307},"Step 4 — ship.",{"type":55,"tag":182,"props":309,"children":310},{},[311,320,325],{"type":55,"tag":209,"props":312,"children":313},{},[314],{"type":55,"tag":104,"props":315,"children":317},{"className":316},[],[318],{"type":60,"value":319},"posthog:error-tracking-alerts-partial-update",{"type":55,"tag":209,"props":321,"children":322},{},[323],{"type":60,"value":324},"Toggle, rename, or modify an existing alert.",{"type":55,"tag":209,"props":326,"children":327},{},[328],{"type":60,"value":329},"When tuning, not authoring.",{"type":55,"tag":182,"props":331,"children":332},{},[333,342,347],{"type":55,"tag":209,"props":334,"children":335},{},[336],{"type":55,"tag":104,"props":337,"children":339},{"className":338},[],[340],{"type":60,"value":341},"posthog:error-tracking-alerts-delete",{"type":55,"tag":209,"props":343,"children":344},{},[345],{"type":60,"value":346},"Soft-delete an alert.",{"type":55,"tag":209,"props":348,"children":349},{},[350],{"type":60,"value":351},"When the user says \"remove\".",{"type":55,"tag":77,"props":353,"children":355},{"id":354},"trigger-events-pick-exactly-one-per-alert",[356],{"type":60,"value":357},"Trigger events — pick exactly one per alert",{"type":55,"tag":63,"props":359,"children":360},{},[361],{"type":60,"value":362},"There are three lifecycle events. Each has a different \"noise vs urgency\" trade-off — picking the wrong\none is the most common cause of alert fatigue here.",{"type":55,"tag":174,"props":364,"children":365},{},[366,387],{"type":55,"tag":178,"props":367,"children":368},{},[369],{"type":55,"tag":182,"props":370,"children":371},{},[372,377,382],{"type":55,"tag":186,"props":373,"children":374},{},[375],{"type":60,"value":376},"Event",{"type":55,"tag":186,"props":378,"children":379},{},[380],{"type":60,"value":381},"Fires when",{"type":55,"tag":186,"props":383,"children":384},{},[385],{"type":60,"value":386},"Use when",{"type":55,"tag":202,"props":388,"children":389},{},[390,412,434],{"type":55,"tag":182,"props":391,"children":392},{},[393,402,407],{"type":55,"tag":209,"props":394,"children":395},{},[396],{"type":55,"tag":104,"props":397,"children":399},{"className":398},[],[400],{"type":60,"value":401},"$error_tracking_issue_created",{"type":55,"tag":209,"props":403,"children":404},{},[405],{"type":60,"value":406},"A brand-new issue first appears.",{"type":55,"tag":209,"props":408,"children":409},{},[410],{"type":60,"value":411},"Small projects, or projects where every new error type is genuinely worth a look. Floods large\u002Fnoisy projects.",{"type":55,"tag":182,"props":413,"children":414},{},[415,424,429],{"type":55,"tag":209,"props":416,"children":417},{},[418],{"type":55,"tag":104,"props":419,"children":421},{"className":420},[],[422],{"type":60,"value":423},"$error_tracking_issue_reopened",{"type":55,"tag":209,"props":425,"children":426},{},[427],{"type":60,"value":428},"A previously resolved issue starts emitting again.",{"type":55,"tag":209,"props":430,"children":431},{},[432],{"type":60,"value":433},"Catch regressions on issues someone already triaged. The safest \"I want to know if this comes back\" trigger.",{"type":55,"tag":182,"props":435,"children":436},{},[437,446,451],{"type":55,"tag":209,"props":438,"children":439},{},[440],{"type":55,"tag":104,"props":441,"children":443},{"className":442},[],[444],{"type":60,"value":445},"$error_tracking_issue_spiking",{"type":55,"tag":209,"props":447,"children":448},{},[449],{"type":60,"value":450},"The spike detector flags abnormal volume on an issue.",{"type":55,"tag":209,"props":452,"children":453},{},[454],{"type":60,"value":455},"Production projects with high baseline volume. Threshold\u002Fmultiplier is shared across the project — check spike config before using.",{"type":55,"tag":63,"props":457,"children":458},{},[459,461,467],{"type":60,"value":460},"If the user is vague (\"alert me on errors\"), default to ",{"type":55,"tag":104,"props":462,"children":464},{"className":463},[],[465],{"type":60,"value":466},"_spiking",{"type":60,"value":468},". It's the most signal-dense trigger\nand the least likely to cause alert fatigue. Confirm explicitly before proceeding.",{"type":55,"tag":77,"props":470,"children":472},{"id":471},"workflow",[473],{"type":60,"value":474},"Workflow",{"type":55,"tag":476,"props":477,"children":479},"h3",{"id":478},"_1-confirm-intent",[480],{"type":60,"value":481},"1. Confirm intent",{"type":55,"tag":63,"props":483,"children":484},{},[485],{"type":60,"value":486},"You need three things from the user before creating anything:",{"type":55,"tag":84,"props":488,"children":489},{},[490,508,518],{"type":55,"tag":88,"props":491,"children":492},{},[493,499,501,506],{"type":55,"tag":494,"props":495,"children":496},"strong",{},[497],{"type":60,"value":498},"Which trigger event.",{"type":60,"value":500}," If unspecified, recommend ",{"type":55,"tag":104,"props":502,"children":504},{"className":503},[],[505],{"type":60,"value":466},{"type":60,"value":507}," and ask for confirmation. Do not silently\npick one.",{"type":55,"tag":88,"props":509,"children":510},{},[511,516],{"type":55,"tag":494,"props":512,"children":513},{},[514],{"type":60,"value":515},"Which channel.",{"type":60,"value":517}," Slack channel name, webhook URL, Linear team, etc. Never hardcode a production\nchannel. If the user says \"the dev channel\", ask for the exact channel id or name.",{"type":55,"tag":88,"props":519,"children":520},{},[521,526],{"type":55,"tag":494,"props":522,"children":523},{},[524],{"type":60,"value":525},"Which scope.",{"type":60,"value":527}," All issues (most common), or scoped to a specific issue \u002F exception type \u002F assignee.",{"type":55,"tag":476,"props":529,"children":531},{"id":530},"_2-dedupe-against-existing-alerts",[532],{"type":60,"value":533},"2. Dedupe against existing alerts",{"type":55,"tag":63,"props":535,"children":536},{},[537,539,544,546,552],{"type":60,"value":538},"Call ",{"type":55,"tag":104,"props":540,"children":542},{"className":541},[],[543],{"type":60,"value":217},{"type":60,"value":545},". Filter the response client-side by ",{"type":55,"tag":104,"props":547,"children":549},{"className":548},[],[550],{"type":60,"value":551},"filters.events[].id",{"type":60,"value":553},".",{"type":55,"tag":84,"props":555,"children":556},{},[557,584,589],{"type":55,"tag":88,"props":558,"children":559},{},[560,562,567,569,574,576,582],{"type":60,"value":561},"If an alert exists for the ",{"type":55,"tag":494,"props":563,"children":564},{},[565],{"type":60,"value":566},"same event",{"type":60,"value":568}," delivering to the ",{"type":55,"tag":494,"props":570,"children":571},{},[572],{"type":60,"value":573},"same channel",{"type":60,"value":575},", stop. Tell the user it\nalready exists and ask whether they want to change anything (in which case use\n",{"type":55,"tag":104,"props":577,"children":579},{"className":578},[],[580],{"type":60,"value":581},"error-tracking-alerts-partial-update",{"type":60,"value":583},") or skip.",{"type":55,"tag":88,"props":585,"children":586},{},[587],{"type":60,"value":588},"Multiple alerts on the same event for the same channel produce duplicate Slack messages — the user\nalmost never wants this.",{"type":55,"tag":88,"props":590,"children":591},{},[592,594,599,601,607],{"type":60,"value":593},"Multiple alerts on the same event for ",{"type":55,"tag":494,"props":595,"children":596},{},[597],{"type":60,"value":598},"different",{"type":60,"value":600}," channels (e.g. one for ",{"type":55,"tag":104,"props":602,"children":604},{"className":603},[],[605],{"type":60,"value":606},"#oncall",{"type":60,"value":608},", one for the\noncall webhook) is fine and sometimes intentional. Confirm.",{"type":55,"tag":63,"props":610,"children":611},{},[612,614,620,622,628],{"type":60,"value":613},"PostHog's \"alerts configured\" recommendation only inspects ",{"type":55,"tag":104,"props":615,"children":617},{"className":616},[],[618],{"type":60,"value":619},"filters.events",{"type":60,"value":621}," — adding per-issue\n",{"type":55,"tag":104,"props":623,"children":625},{"className":624},[],[626],{"type":60,"value":627},"filters.properties",{"type":60,"value":629}," does not affect the status the recommendations card reports.",{"type":55,"tag":476,"props":631,"children":633},{"id":632},"_3-pick-the-integration",[634],{"type":60,"value":635},"3. Pick the integration",{"type":55,"tag":63,"props":637,"children":638},{},[639],{"type":60,"value":640},"For Slack:",{"type":55,"tag":642,"props":643,"children":644},"ol",{},[645,670],{"type":55,"tag":88,"props":646,"children":647},{},[648,653,655,660,662,668],{"type":55,"tag":104,"props":649,"children":651},{"className":650},[],[652],{"type":60,"value":239},{"type":60,"value":654}," with ",{"type":55,"tag":104,"props":656,"children":658},{"className":657},[],[659],{"type":60,"value":250},{"type":60,"value":661}," → pick the integration ",{"type":55,"tag":104,"props":663,"children":665},{"className":664},[],[666],{"type":60,"value":667},"id",{"type":60,"value":669}," (an integer).",{"type":55,"tag":88,"props":671,"children":672},{},[673,678,680,686,688,694],{"type":55,"tag":104,"props":674,"children":676},{"className":675},[],[677],{"type":60,"value":269},{"type":60,"value":679}," with that id → pick the channel id (e.g. ",{"type":55,"tag":104,"props":681,"children":683},{"className":682},[],[684],{"type":60,"value":685},"C0123ABC",{"type":60,"value":687},"). Channel\nnames like ",{"type":55,"tag":104,"props":689,"children":691},{"className":690},[],[692],{"type":60,"value":693},"\"#oncall\"",{"type":60,"value":695}," are accepted but channel ids are preferred — they survive renames.",{"type":55,"tag":63,"props":697,"children":698},{},[699,701,707,709,715],{"type":60,"value":700},"For webhook: the user supplies a single ",{"type":55,"tag":104,"props":702,"children":704},{"className":703},[],[705],{"type":60,"value":706},"https:\u002F\u002F",{"type":60,"value":708}," URL. Refuse ",{"type":55,"tag":104,"props":710,"children":712},{"className":711},[],[713],{"type":60,"value":714},"http:\u002F\u002F",{"type":60,"value":716}," URLs.",{"type":55,"tag":63,"props":718,"children":719},{},[720,722,727],{"type":60,"value":721},"For Linear \u002F GitHub \u002F GitLab: confirm the integration is connected via ",{"type":55,"tag":104,"props":723,"children":725},{"className":724},[],[726],{"type":60,"value":239},{"type":60,"value":728}," first,\nthen ask the user which project \u002F repository \u002F team to file issues into.",{"type":55,"tag":476,"props":730,"children":732},{"id":731},"_4-create-the-alert",[733],{"type":60,"value":734},"4. Create the alert",{"type":55,"tag":63,"props":736,"children":737},{},[738,739,744],{"type":60,"value":538},{"type":55,"tag":104,"props":740,"children":742},{"className":741},[],[743],{"type":60,"value":290},{"type":60,"value":745}," with:",{"type":55,"tag":747,"props":748,"children":753},"pre",{"className":749,"code":750,"language":751,"meta":752,"style":752},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"type\": \"internal_destination\",\n  \"template_id\": \"template-slack\",\n  \"name\": \"\u003Cshort, channel-attributed name>\",\n  \"enabled\": true,\n  \"filters\": {\n    \"events\": [{ \"id\": \"$error_tracking_issue_created\", \"type\": \"events\" }]\n  },\n  \"inputs\": {\n    \"slack_workspace\": { \"value\": \u003Cslack_integration_id_int> },\n    \"channel\": { \"value\": \"\u003Cchannel_id>\" },\n    \"text\": { \"value\": \"...\" },\n    \"blocks\": { \"value\": [...] }\n  }\n}\n","json","",[754],{"type":55,"tag":104,"props":755,"children":756},{"__ignoreMap":752},[757,769,814,852,890,916,942,1037,1046,1071,1125,1184,1241,1301,1310],{"type":55,"tag":758,"props":759,"children":762},"span",{"class":760,"line":761},"line",1,[763],{"type":55,"tag":758,"props":764,"children":766},{"style":765},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[767],{"type":60,"value":768},"{\n",{"type":55,"tag":758,"props":770,"children":772},{"class":760,"line":771},2,[773,778,784,789,794,799,805,809],{"type":55,"tag":758,"props":774,"children":775},{"style":765},[776],{"type":60,"value":777},"  \"",{"type":55,"tag":758,"props":779,"children":781},{"style":780},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[782],{"type":60,"value":783},"type",{"type":55,"tag":758,"props":785,"children":786},{"style":765},[787],{"type":60,"value":788},"\"",{"type":55,"tag":758,"props":790,"children":791},{"style":765},[792],{"type":60,"value":793},":",{"type":55,"tag":758,"props":795,"children":796},{"style":765},[797],{"type":60,"value":798}," \"",{"type":55,"tag":758,"props":800,"children":802},{"style":801},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[803],{"type":60,"value":804},"internal_destination",{"type":55,"tag":758,"props":806,"children":807},{"style":765},[808],{"type":60,"value":788},{"type":55,"tag":758,"props":810,"children":811},{"style":765},[812],{"type":60,"value":813},",\n",{"type":55,"tag":758,"props":815,"children":817},{"class":760,"line":816},3,[818,822,827,831,835,839,844,848],{"type":55,"tag":758,"props":819,"children":820},{"style":765},[821],{"type":60,"value":777},{"type":55,"tag":758,"props":823,"children":824},{"style":780},[825],{"type":60,"value":826},"template_id",{"type":55,"tag":758,"props":828,"children":829},{"style":765},[830],{"type":60,"value":788},{"type":55,"tag":758,"props":832,"children":833},{"style":765},[834],{"type":60,"value":793},{"type":55,"tag":758,"props":836,"children":837},{"style":765},[838],{"type":60,"value":798},{"type":55,"tag":758,"props":840,"children":841},{"style":801},[842],{"type":60,"value":843},"template-slack",{"type":55,"tag":758,"props":845,"children":846},{"style":765},[847],{"type":60,"value":788},{"type":55,"tag":758,"props":849,"children":850},{"style":765},[851],{"type":60,"value":813},{"type":55,"tag":758,"props":853,"children":855},{"class":760,"line":854},4,[856,860,865,869,873,877,882,886],{"type":55,"tag":758,"props":857,"children":858},{"style":765},[859],{"type":60,"value":777},{"type":55,"tag":758,"props":861,"children":862},{"style":780},[863],{"type":60,"value":864},"name",{"type":55,"tag":758,"props":866,"children":867},{"style":765},[868],{"type":60,"value":788},{"type":55,"tag":758,"props":870,"children":871},{"style":765},[872],{"type":60,"value":793},{"type":55,"tag":758,"props":874,"children":875},{"style":765},[876],{"type":60,"value":798},{"type":55,"tag":758,"props":878,"children":879},{"style":801},[880],{"type":60,"value":881},"\u003Cshort, channel-attributed name>",{"type":55,"tag":758,"props":883,"children":884},{"style":765},[885],{"type":60,"value":788},{"type":55,"tag":758,"props":887,"children":888},{"style":765},[889],{"type":60,"value":813},{"type":55,"tag":758,"props":891,"children":893},{"class":760,"line":892},5,[894,898,903,907,911],{"type":55,"tag":758,"props":895,"children":896},{"style":765},[897],{"type":60,"value":777},{"type":55,"tag":758,"props":899,"children":900},{"style":780},[901],{"type":60,"value":902},"enabled",{"type":55,"tag":758,"props":904,"children":905},{"style":765},[906],{"type":60,"value":788},{"type":55,"tag":758,"props":908,"children":909},{"style":765},[910],{"type":60,"value":793},{"type":55,"tag":758,"props":912,"children":913},{"style":765},[914],{"type":60,"value":915}," true,\n",{"type":55,"tag":758,"props":917,"children":919},{"class":760,"line":918},6,[920,924,929,933,937],{"type":55,"tag":758,"props":921,"children":922},{"style":765},[923],{"type":60,"value":777},{"type":55,"tag":758,"props":925,"children":926},{"style":780},[927],{"type":60,"value":928},"filters",{"type":55,"tag":758,"props":930,"children":931},{"style":765},[932],{"type":60,"value":788},{"type":55,"tag":758,"props":934,"children":935},{"style":765},[936],{"type":60,"value":793},{"type":55,"tag":758,"props":938,"children":939},{"style":765},[940],{"type":60,"value":941}," {\n",{"type":55,"tag":758,"props":943,"children":945},{"class":760,"line":944},7,[946,951,957,961,965,970,974,979,983,987,991,995,999,1004,1008,1012,1016,1020,1024,1028,1032],{"type":55,"tag":758,"props":947,"children":948},{"style":765},[949],{"type":60,"value":950},"    \"",{"type":55,"tag":758,"props":952,"children":954},{"style":953},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[955],{"type":60,"value":956},"events",{"type":55,"tag":758,"props":958,"children":959},{"style":765},[960],{"type":60,"value":788},{"type":55,"tag":758,"props":962,"children":963},{"style":765},[964],{"type":60,"value":793},{"type":55,"tag":758,"props":966,"children":967},{"style":765},[968],{"type":60,"value":969}," [{",{"type":55,"tag":758,"props":971,"children":972},{"style":765},[973],{"type":60,"value":798},{"type":55,"tag":758,"props":975,"children":977},{"style":976},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[978],{"type":60,"value":667},{"type":55,"tag":758,"props":980,"children":981},{"style":765},[982],{"type":60,"value":788},{"type":55,"tag":758,"props":984,"children":985},{"style":765},[986],{"type":60,"value":793},{"type":55,"tag":758,"props":988,"children":989},{"style":765},[990],{"type":60,"value":798},{"type":55,"tag":758,"props":992,"children":993},{"style":801},[994],{"type":60,"value":401},{"type":55,"tag":758,"props":996,"children":997},{"style":765},[998],{"type":60,"value":788},{"type":55,"tag":758,"props":1000,"children":1001},{"style":765},[1002],{"type":60,"value":1003},",",{"type":55,"tag":758,"props":1005,"children":1006},{"style":765},[1007],{"type":60,"value":798},{"type":55,"tag":758,"props":1009,"children":1010},{"style":976},[1011],{"type":60,"value":783},{"type":55,"tag":758,"props":1013,"children":1014},{"style":765},[1015],{"type":60,"value":788},{"type":55,"tag":758,"props":1017,"children":1018},{"style":765},[1019],{"type":60,"value":793},{"type":55,"tag":758,"props":1021,"children":1022},{"style":765},[1023],{"type":60,"value":798},{"type":55,"tag":758,"props":1025,"children":1026},{"style":801},[1027],{"type":60,"value":956},{"type":55,"tag":758,"props":1029,"children":1030},{"style":765},[1031],{"type":60,"value":788},{"type":55,"tag":758,"props":1033,"children":1034},{"style":765},[1035],{"type":60,"value":1036}," }]\n",{"type":55,"tag":758,"props":1038,"children":1040},{"class":760,"line":1039},8,[1041],{"type":55,"tag":758,"props":1042,"children":1043},{"style":765},[1044],{"type":60,"value":1045},"  },\n",{"type":55,"tag":758,"props":1047,"children":1049},{"class":760,"line":1048},9,[1050,1054,1059,1063,1067],{"type":55,"tag":758,"props":1051,"children":1052},{"style":765},[1053],{"type":60,"value":777},{"type":55,"tag":758,"props":1055,"children":1056},{"style":780},[1057],{"type":60,"value":1058},"inputs",{"type":55,"tag":758,"props":1060,"children":1061},{"style":765},[1062],{"type":60,"value":788},{"type":55,"tag":758,"props":1064,"children":1065},{"style":765},[1066],{"type":60,"value":793},{"type":55,"tag":758,"props":1068,"children":1069},{"style":765},[1070],{"type":60,"value":941},{"type":55,"tag":758,"props":1072,"children":1074},{"class":760,"line":1073},10,[1075,1079,1084,1088,1092,1097,1101,1106,1110,1114,1120],{"type":55,"tag":758,"props":1076,"children":1077},{"style":765},[1078],{"type":60,"value":950},{"type":55,"tag":758,"props":1080,"children":1081},{"style":953},[1082],{"type":60,"value":1083},"slack_workspace",{"type":55,"tag":758,"props":1085,"children":1086},{"style":765},[1087],{"type":60,"value":788},{"type":55,"tag":758,"props":1089,"children":1090},{"style":765},[1091],{"type":60,"value":793},{"type":55,"tag":758,"props":1093,"children":1094},{"style":765},[1095],{"type":60,"value":1096}," {",{"type":55,"tag":758,"props":1098,"children":1099},{"style":765},[1100],{"type":60,"value":798},{"type":55,"tag":758,"props":1102,"children":1103},{"style":976},[1104],{"type":60,"value":1105},"value",{"type":55,"tag":758,"props":1107,"children":1108},{"style":765},[1109],{"type":60,"value":788},{"type":55,"tag":758,"props":1111,"children":1112},{"style":765},[1113],{"type":60,"value":793},{"type":55,"tag":758,"props":1115,"children":1117},{"style":1116},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1118],{"type":60,"value":1119}," \u003Cslack_integration_id_int> ",{"type":55,"tag":758,"props":1121,"children":1122},{"style":765},[1123],{"type":60,"value":1124},"},\n",{"type":55,"tag":758,"props":1126,"children":1128},{"class":760,"line":1127},11,[1129,1133,1138,1142,1146,1150,1154,1158,1162,1166,1170,1175,1179],{"type":55,"tag":758,"props":1130,"children":1131},{"style":765},[1132],{"type":60,"value":950},{"type":55,"tag":758,"props":1134,"children":1135},{"style":953},[1136],{"type":60,"value":1137},"channel",{"type":55,"tag":758,"props":1139,"children":1140},{"style":765},[1141],{"type":60,"value":788},{"type":55,"tag":758,"props":1143,"children":1144},{"style":765},[1145],{"type":60,"value":793},{"type":55,"tag":758,"props":1147,"children":1148},{"style":765},[1149],{"type":60,"value":1096},{"type":55,"tag":758,"props":1151,"children":1152},{"style":765},[1153],{"type":60,"value":798},{"type":55,"tag":758,"props":1155,"children":1156},{"style":976},[1157],{"type":60,"value":1105},{"type":55,"tag":758,"props":1159,"children":1160},{"style":765},[1161],{"type":60,"value":788},{"type":55,"tag":758,"props":1163,"children":1164},{"style":765},[1165],{"type":60,"value":793},{"type":55,"tag":758,"props":1167,"children":1168},{"style":765},[1169],{"type":60,"value":798},{"type":55,"tag":758,"props":1171,"children":1172},{"style":801},[1173],{"type":60,"value":1174},"\u003Cchannel_id>",{"type":55,"tag":758,"props":1176,"children":1177},{"style":765},[1178],{"type":60,"value":788},{"type":55,"tag":758,"props":1180,"children":1181},{"style":765},[1182],{"type":60,"value":1183}," },\n",{"type":55,"tag":758,"props":1185,"children":1187},{"class":760,"line":1186},12,[1188,1192,1196,1200,1204,1208,1212,1216,1220,1224,1228,1233,1237],{"type":55,"tag":758,"props":1189,"children":1190},{"style":765},[1191],{"type":60,"value":950},{"type":55,"tag":758,"props":1193,"children":1194},{"style":953},[1195],{"type":60,"value":60},{"type":55,"tag":758,"props":1197,"children":1198},{"style":765},[1199],{"type":60,"value":788},{"type":55,"tag":758,"props":1201,"children":1202},{"style":765},[1203],{"type":60,"value":793},{"type":55,"tag":758,"props":1205,"children":1206},{"style":765},[1207],{"type":60,"value":1096},{"type":55,"tag":758,"props":1209,"children":1210},{"style":765},[1211],{"type":60,"value":798},{"type":55,"tag":758,"props":1213,"children":1214},{"style":976},[1215],{"type":60,"value":1105},{"type":55,"tag":758,"props":1217,"children":1218},{"style":765},[1219],{"type":60,"value":788},{"type":55,"tag":758,"props":1221,"children":1222},{"style":765},[1223],{"type":60,"value":793},{"type":55,"tag":758,"props":1225,"children":1226},{"style":765},[1227],{"type":60,"value":798},{"type":55,"tag":758,"props":1229,"children":1230},{"style":801},[1231],{"type":60,"value":1232},"...",{"type":55,"tag":758,"props":1234,"children":1235},{"style":765},[1236],{"type":60,"value":788},{"type":55,"tag":758,"props":1238,"children":1239},{"style":765},[1240],{"type":60,"value":1183},{"type":55,"tag":758,"props":1242,"children":1244},{"class":760,"line":1243},13,[1245,1249,1254,1258,1262,1266,1270,1274,1278,1282,1287,1291,1296],{"type":55,"tag":758,"props":1246,"children":1247},{"style":765},[1248],{"type":60,"value":950},{"type":55,"tag":758,"props":1250,"children":1251},{"style":953},[1252],{"type":60,"value":1253},"blocks",{"type":55,"tag":758,"props":1255,"children":1256},{"style":765},[1257],{"type":60,"value":788},{"type":55,"tag":758,"props":1259,"children":1260},{"style":765},[1261],{"type":60,"value":793},{"type":55,"tag":758,"props":1263,"children":1264},{"style":765},[1265],{"type":60,"value":1096},{"type":55,"tag":758,"props":1267,"children":1268},{"style":765},[1269],{"type":60,"value":798},{"type":55,"tag":758,"props":1271,"children":1272},{"style":976},[1273],{"type":60,"value":1105},{"type":55,"tag":758,"props":1275,"children":1276},{"style":765},[1277],{"type":60,"value":788},{"type":55,"tag":758,"props":1279,"children":1280},{"style":765},[1281],{"type":60,"value":793},{"type":55,"tag":758,"props":1283,"children":1284},{"style":765},[1285],{"type":60,"value":1286}," [",{"type":55,"tag":758,"props":1288,"children":1289},{"style":1116},[1290],{"type":60,"value":1232},{"type":55,"tag":758,"props":1292,"children":1293},{"style":765},[1294],{"type":60,"value":1295},"]",{"type":55,"tag":758,"props":1297,"children":1298},{"style":765},[1299],{"type":60,"value":1300}," }\n",{"type":55,"tag":758,"props":1302,"children":1304},{"class":760,"line":1303},14,[1305],{"type":55,"tag":758,"props":1306,"children":1307},{"style":765},[1308],{"type":60,"value":1309},"  }\n",{"type":55,"tag":758,"props":1311,"children":1313},{"class":760,"line":1312},15,[1314],{"type":55,"tag":758,"props":1315,"children":1316},{"style":765},[1317],{"type":60,"value":1318},"}\n",{"type":55,"tag":63,"props":1320,"children":1321},{},[1322,1324,1329,1331,1338],{"type":60,"value":1323},"The canonical Slack ",{"type":55,"tag":104,"props":1325,"children":1327},{"className":1326},[],[1328],{"type":60,"value":1253},{"type":60,"value":1330}," payload for each event lives in\n",{"type":55,"tag":1332,"props":1333,"children":1335},"a",{"href":1334},".\u002Freferences\u002Fblock-templates.md",[1336],{"type":60,"value":1337},"references\u002Fblock-templates.md",{"type":60,"value":1339},". Copy the matching block verbatim — it\nmatches the in-product alert wizard, so agent-created alerts look identical to UI-created ones.",{"type":55,"tag":63,"props":1341,"children":1342},{},[1343,1345,1351,1353,1359,1361,1366],{"type":60,"value":1344},"For per-issue scoping — ",{"type":55,"tag":104,"props":1346,"children":1348},{"className":1347},[],[1349],{"type":60,"value":1350},"created",{"type":60,"value":1352}," \u002F ",{"type":55,"tag":104,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":60,"value":1358},"reopened",{"type":60,"value":1360}," only, spiking events carry no exception properties — add\nto ",{"type":55,"tag":104,"props":1362,"children":1364},{"className":1363},[],[1365],{"type":60,"value":928},{"type":60,"value":793},{"type":55,"tag":747,"props":1368,"children":1370},{"className":749,"code":1369,"language":751,"meta":752,"style":752},"\"properties\": [\n  { \"key\": \"$exception_issue_id\", \"value\": \"\u003Cissue_uuid>\", \"operator\": \"exact\", \"type\": \"event\" }\n]\n",[1371],{"type":55,"tag":104,"props":1372,"children":1373},{"__ignoreMap":752},[1374,1400,1542],{"type":55,"tag":758,"props":1375,"children":1376},{"class":760,"line":761},[1377,1381,1386,1390,1395],{"type":55,"tag":758,"props":1378,"children":1379},{"style":765},[1380],{"type":60,"value":788},{"type":55,"tag":758,"props":1382,"children":1383},{"style":801},[1384],{"type":60,"value":1385},"properties",{"type":55,"tag":758,"props":1387,"children":1388},{"style":765},[1389],{"type":60,"value":788},{"type":55,"tag":758,"props":1391,"children":1392},{"style":1116},[1393],{"type":60,"value":1394},": ",{"type":55,"tag":758,"props":1396,"children":1397},{"style":765},[1398],{"type":60,"value":1399},"[\n",{"type":55,"tag":758,"props":1401,"children":1402},{"class":760,"line":771},[1403,1408,1412,1417,1421,1425,1429,1434,1438,1442,1446,1450,1454,1458,1462,1467,1471,1475,1479,1484,1488,1492,1496,1501,1505,1509,1513,1517,1521,1525,1529,1534,1538],{"type":55,"tag":758,"props":1404,"children":1405},{"style":765},[1406],{"type":60,"value":1407},"  {",{"type":55,"tag":758,"props":1409,"children":1410},{"style":765},[1411],{"type":60,"value":798},{"type":55,"tag":758,"props":1413,"children":1414},{"style":780},[1415],{"type":60,"value":1416},"key",{"type":55,"tag":758,"props":1418,"children":1419},{"style":765},[1420],{"type":60,"value":788},{"type":55,"tag":758,"props":1422,"children":1423},{"style":765},[1424],{"type":60,"value":793},{"type":55,"tag":758,"props":1426,"children":1427},{"style":765},[1428],{"type":60,"value":798},{"type":55,"tag":758,"props":1430,"children":1431},{"style":801},[1432],{"type":60,"value":1433},"$exception_issue_id",{"type":55,"tag":758,"props":1435,"children":1436},{"style":765},[1437],{"type":60,"value":788},{"type":55,"tag":758,"props":1439,"children":1440},{"style":765},[1441],{"type":60,"value":1003},{"type":55,"tag":758,"props":1443,"children":1444},{"style":765},[1445],{"type":60,"value":798},{"type":55,"tag":758,"props":1447,"children":1448},{"style":780},[1449],{"type":60,"value":1105},{"type":55,"tag":758,"props":1451,"children":1452},{"style":765},[1453],{"type":60,"value":788},{"type":55,"tag":758,"props":1455,"children":1456},{"style":765},[1457],{"type":60,"value":793},{"type":55,"tag":758,"props":1459,"children":1460},{"style":765},[1461],{"type":60,"value":798},{"type":55,"tag":758,"props":1463,"children":1464},{"style":801},[1465],{"type":60,"value":1466},"\u003Cissue_uuid>",{"type":55,"tag":758,"props":1468,"children":1469},{"style":765},[1470],{"type":60,"value":788},{"type":55,"tag":758,"props":1472,"children":1473},{"style":765},[1474],{"type":60,"value":1003},{"type":55,"tag":758,"props":1476,"children":1477},{"style":765},[1478],{"type":60,"value":798},{"type":55,"tag":758,"props":1480,"children":1481},{"style":780},[1482],{"type":60,"value":1483},"operator",{"type":55,"tag":758,"props":1485,"children":1486},{"style":765},[1487],{"type":60,"value":788},{"type":55,"tag":758,"props":1489,"children":1490},{"style":765},[1491],{"type":60,"value":793},{"type":55,"tag":758,"props":1493,"children":1494},{"style":765},[1495],{"type":60,"value":798},{"type":55,"tag":758,"props":1497,"children":1498},{"style":801},[1499],{"type":60,"value":1500},"exact",{"type":55,"tag":758,"props":1502,"children":1503},{"style":765},[1504],{"type":60,"value":788},{"type":55,"tag":758,"props":1506,"children":1507},{"style":765},[1508],{"type":60,"value":1003},{"type":55,"tag":758,"props":1510,"children":1511},{"style":765},[1512],{"type":60,"value":798},{"type":55,"tag":758,"props":1514,"children":1515},{"style":780},[1516],{"type":60,"value":783},{"type":55,"tag":758,"props":1518,"children":1519},{"style":765},[1520],{"type":60,"value":788},{"type":55,"tag":758,"props":1522,"children":1523},{"style":765},[1524],{"type":60,"value":793},{"type":55,"tag":758,"props":1526,"children":1527},{"style":765},[1528],{"type":60,"value":798},{"type":55,"tag":758,"props":1530,"children":1531},{"style":801},[1532],{"type":60,"value":1533},"event",{"type":55,"tag":758,"props":1535,"children":1536},{"style":765},[1537],{"type":60,"value":788},{"type":55,"tag":758,"props":1539,"children":1540},{"style":765},[1541],{"type":60,"value":1300},{"type":55,"tag":758,"props":1543,"children":1544},{"class":760,"line":816},[1545],{"type":55,"tag":758,"props":1546,"children":1547},{"style":765},[1548],{"type":60,"value":1549},"]\n",{"type":55,"tag":63,"props":1551,"children":1552},{},[1553,1555,1561,1563,1568,1570,1576],{"type":60,"value":1554},"Other useful property filters: ",{"type":55,"tag":104,"props":1556,"children":1558},{"className":1557},[],[1559],{"type":60,"value":1560},"$exception_types",{"type":60,"value":1562}," (exception class names, an array), ",{"type":55,"tag":104,"props":1564,"children":1566},{"className":1565},[],[1567],{"type":60,"value":864},{"type":60,"value":1569}," (issue\ntitle). See ",{"type":55,"tag":1332,"props":1571,"children":1573},{"href":1572},".\u002Freferences\u002Fevent-triggers.md",[1574],{"type":60,"value":1575},"references\u002Fevent-triggers.md",{"type":60,"value":1577}," for the full property surface\nper event.",{"type":55,"tag":476,"props":1579,"children":1581},{"id":1580},"_5-verify",[1582],{"type":60,"value":1583},"5. Verify",{"type":55,"tag":63,"props":1585,"children":1586},{},[1587,1589,1595,1597,1602],{"type":60,"value":1588},"Echo the alert back to the user with: name, trigger event (human-readable), destination, and a one-line\npreview of the message body. Do not echo Slack workspace ids or webhook URLs — those are sensitive. Tell\nthe user how to disable: \"you can pause this alert by setting ",{"type":55,"tag":104,"props":1590,"children":1592},{"className":1591},[],[1593],{"type":60,"value":1594},"enabled: false",{"type":60,"value":1596}," via\n",{"type":55,"tag":104,"props":1598,"children":1600},{"className":1599},[],[1601],{"type":60,"value":581},{"type":60,"value":1603}," or by toggling it in the destinations UI.\"",{"type":55,"tag":77,"props":1605,"children":1607},{"id":1606},"naming-convention",[1608],{"type":60,"value":1609},"Naming convention",{"type":55,"tag":63,"props":1611,"children":1612},{},[1613,1615,1621],{"type":60,"value":1614},"Use ",{"type":55,"tag":104,"props":1616,"children":1618},{"className":1617},[],[1619],{"type":60,"value":1620},"\u003Ctrigger> · \u003Cchannel> (auto)",{"type":60,"value":1622}," so the user can scan their alert list and spot agent-created entries.\nExamples:",{"type":55,"tag":84,"props":1624,"children":1625},{},[1626,1635,1644],{"type":55,"tag":88,"props":1627,"children":1628},{},[1629],{"type":55,"tag":104,"props":1630,"children":1632},{"className":1631},[],[1633],{"type":60,"value":1634},"Issue spiking · #oncall (auto)",{"type":55,"tag":88,"props":1636,"children":1637},{},[1638],{"type":55,"tag":104,"props":1639,"children":1641},{"className":1640},[],[1642],{"type":60,"value":1643},"Issue reopened · #regressions-webhook (auto)",{"type":55,"tag":88,"props":1645,"children":1646},{},[1647],{"type":55,"tag":104,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":60,"value":1652},"Issue created · Linear\u002FEng (auto)",{"type":55,"tag":63,"props":1654,"children":1655},{},[1656],{"type":60,"value":1657},"Do not use the issue title in the name — alerts can match many issues, and the title becomes stale once\nthe issue evolves.",{"type":55,"tag":77,"props":1659,"children":1661},{"id":1660},"token-economy-rules",[1662],{"type":60,"value":1663},"Token-economy rules",{"type":55,"tag":84,"props":1665,"children":1666},{},[1667,1679,1684,1696],{"type":55,"tag":88,"props":1668,"children":1669},{},[1670,1672,1677],{"type":60,"value":1671},"One ",{"type":55,"tag":104,"props":1673,"children":1675},{"className":1674},[],[1676],{"type":60,"value":217},{"type":60,"value":1678}," call up front, not per candidate.",{"type":55,"tag":88,"props":1680,"children":1681},{},[1682],{"type":60,"value":1683},"Reuse a single integration lookup for multiple alerts going to the same workspace.",{"type":55,"tag":88,"props":1685,"children":1686},{},[1687,1689,1694],{"type":60,"value":1688},"Confirm the channel \u002F URL with the user ",{"type":55,"tag":494,"props":1690,"children":1691},{},[1692],{"type":60,"value":1693},"before",{"type":60,"value":1695}," creating each alert. Never batch-create alerts to a\ndestination the user has not explicitly named.",{"type":55,"tag":88,"props":1697,"children":1698},{},[1699],{"type":60,"value":1700},"Cap iteration at 1 round per alert. If the user wants three alerts, that's three create calls — not\nthree create calls per alert.",{"type":55,"tag":77,"props":1702,"children":1704},{"id":1703},"output",[1705],{"type":60,"value":1706},"Output",{"type":55,"tag":63,"props":1708,"children":1709},{},[1710],{"type":60,"value":1711},"Report what you did, in this shape:",{"type":55,"tag":84,"props":1713,"children":1714},{},[1715,1720,1725],{"type":55,"tag":88,"props":1716,"children":1717},{},[1718],{"type":60,"value":1719},"For each shipped alert: name, trigger event, destination (channel name or webhook host — never the\nfull URL), enabled state.",{"type":55,"tag":88,"props":1721,"children":1722},{},[1723],{"type":60,"value":1724},"For each skipped alert: trigger + channel + why (already exists, user declined, missing integration).",{"type":55,"tag":88,"props":1726,"children":1727},{},[1728,1730,1735],{"type":60,"value":1729},"Anything the user should do next: enable the spike detection config (if they picked ",{"type":55,"tag":104,"props":1731,"children":1733},{"className":1732},[],[1734],{"type":60,"value":466},{"type":60,"value":1736}," and the\ndetector hasn't been turned on), wire up source maps (so the alert's stack trace links resolve), or\ntune the alert filters after watching it for a day.",{"type":55,"tag":1738,"props":1739,"children":1740},"style",{},[1741],{"type":60,"value":1742},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1744,"total":1836},[1745,1759,1771,1783,1796,1803,1819],{"slug":1746,"name":1746,"fn":1747,"description":1748,"org":1749,"tags":1750,"stars":23,"repoUrl":24,"updatedAt":1758},"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},[1751,1753,1756,1757],{"name":1752,"slug":31,"type":15},"Analytics",{"name":1754,"slug":1755,"type":15},"Cost Optimization","cost-optimization",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-07-28T05:34:11.117757",{"slug":1760,"name":1760,"fn":1761,"description":1762,"org":1763,"tags":1764,"stars":23,"repoUrl":24,"updatedAt":1770},"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},[1765,1766,1769],{"name":1752,"slug":31,"type":15},{"name":1767,"slug":1768,"type":15},"Audit","audit",{"name":9,"slug":8,"type":15},"2026-06-08T08:08:33.693989",{"slug":1772,"name":1772,"fn":1773,"description":1774,"org":1775,"tags":1776,"stars":23,"repoUrl":24,"updatedAt":1782},"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},[1777,1778,1780,1781],{"name":1767,"slug":1768,"type":15},{"name":1779,"slug":33,"type":15},"Data Warehouse",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-06-18T08:22:57.67984",{"slug":1784,"name":1784,"fn":1785,"description":1786,"org":1787,"tags":1788,"stars":23,"repoUrl":24,"updatedAt":1795},"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},[1789,1790,1791,1794],{"name":1767,"slug":1768,"type":15},{"name":1779,"slug":33,"type":15},{"name":1792,"slug":1793,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-06-18T08:25:10.936787",{"slug":4,"name":4,"fn":5,"description":6,"org":1797,"tags":1798,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1799,1800,1801,1802],{"name":17,"slug":18,"type":15},{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":1804,"name":1804,"fn":1805,"description":1806,"org":1807,"tags":1808,"stars":23,"repoUrl":24,"updatedAt":1818},"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},[1809,1810,1813,1814,1817],{"name":1752,"slug":31,"type":15},{"name":1811,"slug":1812,"type":15},"Monitoring","monitoring",{"name":13,"slug":14,"type":15},{"name":1815,"slug":1816,"type":15},"Operations","operations",{"name":9,"slug":8,"type":15},"2026-07-18T05:10:54.430898",{"slug":1820,"name":1820,"fn":1821,"description":1822,"org":1823,"tags":1824,"stars":23,"repoUrl":24,"updatedAt":1835},"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},[1825,1828,1831,1832],{"name":1826,"slug":1827,"type":15},"Automation","automation",{"name":1829,"slug":1830,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},{"name":1833,"slug":1834,"type":15},"Workflow Automation","workflow-automation","2026-07-28T05:34:12.167015",61,{"items":1838,"total":1955},[1839,1846,1852,1859,1866,1873,1881,1888,1902,1917,1927,1945],{"slug":1746,"name":1746,"fn":1747,"description":1748,"org":1840,"tags":1841,"stars":23,"repoUrl":24,"updatedAt":1758},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1842,1843,1844,1845],{"name":1752,"slug":31,"type":15},{"name":1754,"slug":1755,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":1760,"name":1760,"fn":1761,"description":1762,"org":1847,"tags":1848,"stars":23,"repoUrl":24,"updatedAt":1770},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1849,1850,1851],{"name":1752,"slug":31,"type":15},{"name":1767,"slug":1768,"type":15},{"name":9,"slug":8,"type":15},{"slug":1772,"name":1772,"fn":1773,"description":1774,"org":1853,"tags":1854,"stars":23,"repoUrl":24,"updatedAt":1782},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1855,1856,1857,1858],{"name":1767,"slug":1768,"type":15},{"name":1779,"slug":33,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":1784,"name":1784,"fn":1785,"description":1786,"org":1860,"tags":1861,"stars":23,"repoUrl":24,"updatedAt":1795},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1862,1863,1864,1865],{"name":1767,"slug":1768,"type":15},{"name":1779,"slug":33,"type":15},{"name":1792,"slug":1793,"type":15},{"name":9,"slug":8,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1867,"tags":1868,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1869,1870,1871,1872],{"name":17,"slug":18,"type":15},{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":1804,"name":1804,"fn":1805,"description":1806,"org":1874,"tags":1875,"stars":23,"repoUrl":24,"updatedAt":1818},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1876,1877,1878,1879,1880],{"name":1752,"slug":31,"type":15},{"name":1811,"slug":1812,"type":15},{"name":13,"slug":14,"type":15},{"name":1815,"slug":1816,"type":15},{"name":9,"slug":8,"type":15},{"slug":1820,"name":1820,"fn":1821,"description":1822,"org":1882,"tags":1883,"stars":23,"repoUrl":24,"updatedAt":1835},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1884,1885,1886,1887],{"name":1826,"slug":1827,"type":15},{"name":1829,"slug":1830,"type":15},{"name":9,"slug":8,"type":15},{"name":1833,"slug":1834,"type":15},{"slug":1889,"name":1889,"fn":1890,"description":1891,"org":1892,"tags":1893,"stars":23,"repoUrl":24,"updatedAt":1901},"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},[1894,1895,1896,1899,1900],{"name":1752,"slug":31,"type":15},{"name":21,"slug":22,"type":15},{"name":1897,"slug":1898,"type":15},"Frontend","frontend",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-05-07T05:56:19.828048",{"slug":1903,"name":1903,"fn":1904,"description":1905,"org":1906,"tags":1907,"stars":23,"repoUrl":24,"updatedAt":1916},"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},[1908,1911,1912,1913],{"name":1909,"slug":1910,"type":15},"API Development","api-development",{"name":1897,"slug":1898,"type":15},{"name":9,"slug":8,"type":15},{"name":1914,"slug":1915,"type":15},"SDK","sdk","2026-06-08T08:08:34.929454",{"slug":1918,"name":1918,"fn":1919,"description":1920,"org":1921,"tags":1922,"stars":23,"repoUrl":24,"updatedAt":1926},"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},[1923,1924,1925],{"name":1909,"slug":1910,"type":15},{"name":1815,"slug":1816,"type":15},{"name":9,"slug":8,"type":15},"2026-07-15T05:29:58.442727",{"slug":1928,"name":1928,"fn":1929,"description":1930,"org":1931,"tags":1932,"stars":23,"repoUrl":24,"updatedAt":1944},"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},[1933,1934,1937,1938,1941],{"name":1826,"slug":1827,"type":15},{"name":1935,"slug":1936,"type":15},"Email","email",{"name":9,"slug":8,"type":15},{"name":1939,"slug":1940,"type":15},"Reporting","reporting",{"name":1942,"slug":1943,"type":15},"Slack","slack","2026-06-09T07:32:27.935712",{"slug":1946,"name":1946,"fn":1947,"description":1948,"org":1949,"tags":1950,"stars":23,"repoUrl":24,"updatedAt":1954},"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},[1951,1952,1953],{"name":1752,"slug":31,"type":15},{"name":1909,"slug":1910,"type":15},{"name":9,"slug":8,"type":15},"2026-06-08T08:08:29.624498",231]