[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-posthog-creating-ai-subscription":3,"mdc--f3gcal-key":52,"related-repo-posthog-creating-ai-subscription":1599,"related-org-posthog-creating-ai-subscription":1701},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":47,"sourceUrl":50,"mdContent":51},"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},"posthog","PostHog","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fposthog.png",[12,14,17,20,23],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Reporting","reporting",{"name":18,"slug":19,"type":13},"Automation","automation",{"name":21,"slug":22,"type":13},"Slack","slack",{"name":24,"slug":25,"type":13},"Email","email",35568,"https:\u002F\u002Fgithub.com\u002FPostHog\u002Fposthog","2026-06-09T07:32:27.935712",null,2977,[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"ab-testing","ai-analytics","analytics","cdp","data-warehouse","experiments","feature-flags","javascript","product-analytics","python","react","session-replay","surveys","typescript","web-analytics",{"repoUrl":27,"stars":26,"forks":30,"topics":48,"description":49},[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"🦔 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\u002Fsubscriptions\u002Fskills\u002Fcreating-ai-subscription","---\nname: creating-ai-subscription\ndescription: >\n  Create a recurring AI-generated PostHog report — schedule a free-text prompt to\n  run on a cron, with the LLM-synthesized markdown delivered to email or Slack on\n  each tick. Use when the user wants a recurring AI summary of X on any cadence\n  (daily, weekly, monthly, yearly) rather than a one-off report. (To attach an AI\n  summary to an existing insight\u002Fdashboard\n  subscription instead of a free-text prompt, see `managing-subscriptions` and its\n  `summary_enabled` option.)\n---\n\n# Creating a prompt subscription\n\n## When to use this\n\nA **subscription** delivers a PostHog report to email or Slack on a recurring\nschedule. There are three kinds, distinguished by which field you set — the kind is\nderived and returned as the read-only `resource_type`:\n\n- **`insight`** — periodic snapshots of one existing insight (`resource_type: \"insight\"`)\n- **`dashboard`** — periodic snapshots of a dashboard's tiles (`resource_type: \"dashboard\"`)\n- **`prompt`** — a recurring **AI-generated** report from a free-text prompt: an LLM\n  plans and runs HogQL over the project's data and synthesizes a fresh markdown report\n  each tick (`resource_type: \"ai_prompt\"`)\n\nUse **this** skill for the **prompt** kind — i.e. when the user wants a recurring AI\nsummary of X (on any cadence — daily, weekly, monthly, yearly) rather than a recurring\nsnapshot of one existing insight\u002Fdashboard, or a single one-off report. Pick a prompt subscription when the\nvalue is the _analysis itself_ (the LLM deciding what to query and writing it up),\nnot a fixed chart they already built. For an insight\u002Fdashboard subscription, set\n`insight`\u002F`dashboard` instead of `prompt` and the AI gates below don't apply.\n\nThis skill covers **creating** the subscription. Once it exists you manage its\nlifecycle with the same `subscriptions-*` tools (see below): list it, edit\u002Fdisable\u002F\nre-enable it, send a test delivery, or delete it.\n\n## Tools\n\n| Tool                                         | Purpose                                             |\n| -------------------------------------------- | --------------------------------------------------- |\n| `posthog:subscriptions-create`               | Create the recurring prompt subscription            |\n| `posthog:subscriptions-list`                 | Confirm it landed; inspect existing subscriptions   |\n| `posthog:subscriptions-partial-update`       | Edit, disable (`enabled: false`), or re-enable it   |\n| `posthog:subscriptions-test-delivery-create` | Send an immediate test delivery to its target(s)    |\n| `posthog:subscriptions-delete`               | Soft-delete it (stops all future deliveries)        |\n| `posthog:integrations-list`                  | Find a Slack `integration_id` (filter `kind=slack`) |\n| `posthog:integrations-channels-retrieve`     | List a Slack integration's channels (id + name)     |\n\n## What you need before calling\n\nThe endpoint enforces three create-time gates and will return 400 if any fails:\n\n1. **PostHog Cloud, or `DEBUG=true`** — self-hosted production deployments are not\n   eligible (the LLM call routes through a PostHog-managed key).\n2. **Org-level \"AI data processing approved\"** — must be toggled on in\n   `Org settings → Data → AI data processing`. The user must opt in to AI features\n   for the organization first.\n3. **Prompt subscriptions enabled** for the organization — a PostHog-managed rollout\n   flag. If it's off, the org has not been granted access yet; tell the user to\n   reach out to PostHog to enable it (there is no self-serve toggle).\n\nIf any of the three is missing, stop and tell the user which one to fix —\nre-calling the tool will not help.\n\nYour access token also needs the **`query:read`** scope in addition to\n`subscription:write`: a prompt subscription runs LLM-generated HogQL over the project's\ndata, so the backend requires query access to create, edit\u002Fre-enable, test-deliver,\nor delete one. A `subscription:write`-only token is rejected with a 403.\n\n## Required arguments\n\n```yaml\nprompt: \"...\"                         # ≤4000 chars; setting this (with no insight\u002Fdashboard) makes it a prompt sub → resource_type \"ai_prompt\"\ntarget_type: \"email\" | \"slack\"        # webhook is rejected for prompt subs\ntarget_value: \"...\"                   # comma-separated emails, or \"\u003Cchannel_id>|\u003Cchannel_name>\"\nfrequency: \"daily\" | \"weekly\" | \"monthly\" | \"yearly\"\ninterval: 1                            # 1 = every tick; 2 = every other tick; etc.\nstart_date: \"2026-09-15T09:00:00Z\"   # anchors the recurrence + time-of-day; need not be in the future — the scheduler delivers the next occurrence\ntitle: \"...\"                          # display name in the subscriptions list\n```\n\nThere is no `resource_type` argument to send — the kind is **derived**\nfrom which field you set (`prompt` ⇒ AI report) and returned as the read-only `resource_type`.\n\n## Optional arguments\n\n```yaml\nbyweekday: ['monday', 'wednesday'] # weekly only — days the rrule fires\nbysetpos: 1 # most useful with monthly; requires byweekday — e.g. byweekday:['monday']+bysetpos:-1 = last Monday\ncount: 10 # cap total deliveries\nuntil_date: '2026-12-31T00:00:00Z' # stop on\u002Fbefore this date\nintegration_id: 42 # Slack only — required; from integrations-list (see \"Slack target\")\n```\n\n## Slack target\n\n`target_value` must be `\u003Cchannel_id>|\u003Cchannel_name>` (the format the integration\nreturns). Build it in three steps:\n\n1. `posthog:integrations-list` filtered by `kind=slack` → pick the Slack\n   integration's `id`.\n2. `posthog:integrations-channels-retrieve` with that `id` → pick a channel; it\n   returns each channel's `id` and `name`, which you assemble into `target_value`\n   as `\u003Cid>|\u003Cname>`.\n3. Pass that integration's `id` as `integration_id` — the subscription is pinned\n   to one specific Slack integration so reconnections elsewhere don't accidentally\n   re-route deliveries.\n\n## Examples\n\n### Weekly Monday-morning AI summary by email\n\n```yaml\nprompt: 'Top events week over week, with the biggest drops and any new failure modes called out.'\ntarget_type: email\ntarget_value: founders@acme.example\nfrequency: weekly\ninterval: 1\nbyweekday: ['monday']\nstart_date: '2026-09-14T08:00:00Z'\ntitle: 'Weekly product pulse'\n```\n\n### Daily Slack report at 9am\n\n```yaml\nprompt: \"Yesterday's sign-ups, where they came from, and any errors they hit during onboarding.\"\ntarget_type: slack\ntarget_value: 'C0123456789|growth-updates' # \u003Cchannel_id>|\u003Cchannel_name>; only the channel id is used, the name is cosmetic\nintegration_id: 42\nfrequency: daily\ninterval: 1\nstart_date: '2026-09-15T09:00:00Z'\ntitle: 'Daily onboarding watch'\n```\n\n## Pitfalls\n\n- **The kind is immutable.** It's derived from which relation is set, so you can't flip an\n  insight or dashboard sub into a prompt sub after the fact (or vice versa) — a PATCH that adds a\n  `prompt` to an insight sub is rejected. Pick the right kind at create time.\n- **Re-enabling a previously auto-disabled prompt sub** has two preconditions, both\n  enforced on the PATCH: (1) a valid `prompt` — already persisted on the row, or a\n  new one in the PATCH body (so bare `{\"enabled\": true}` works when the stored prompt\n  is still valid, but is rejected when the disable cause was an invalid prompt until\n  you supply a good one); and (2) the **original creator is still an active user** —\n  if that account was deactivated the sub cannot be re-enabled at all (no prompt will\n  help; re-create it instead).\n- **`next_delivery_date` is server-computed from the rrule.** Don't try to set it\n  manually — it's read-only. The first delivery fires at the first `start_date`\n  occurrence that is at least a short buffer (currently ~15 minutes) in the future,\n  so a `start_date` only seconds ahead rolls to the next occurrence.\n- **Transient send failures retry; only permanent failures auto-disable.** A\n  transient failure (Slack rate limit, SMTP blip, network) fails that delivery and\n  is retried by Temporal within the run, then re-fires on the next scheduled tick —\n  it does **not** auto-disable the subscription, so a persistently-failing channel\n  will keep retrying every tick until you fix it. Only permanent\u002Fstructural causes\n  auto-disable: a disconnected Slack integration, a revoked channel permission, an\n  invalid prompt, or revoked AI data-processing consent. (For multi-recipient email,\n  a delivery only fails when _every_ recipient fails; partial successes still send.)\n  Within a single delivery run the rendered markdown is cached, so Temporal retries\n  of that run don't re-run the LLM pipeline — but each new scheduled tick generates a\n  fresh report.\n\n## After it lands\n\n`subscriptions-list` will return the new row. Confirm `resource_type: \"ai_prompt\"`,\n`enabled: true`, `next_delivery_date` is in the future, and `prompt` matches what\nyou sent. The first scheduled tick will run the planner → HogQL → synthesis\npipeline and email\u002FSlack the rendered markdown.\n",{"data":53,"body":54},{"name":4,"description":6},{"type":55,"children":56},"root",[57,66,73,96,172,219,239,245,415,421,426,474,479,510,516,752,785,791,952,958,976,1068,1074,1081,1258,1264,1435,1441,1547,1553,1593],{"type":58,"tag":59,"props":60,"children":62},"element","h1",{"id":61},"creating-a-prompt-subscription",[63],{"type":64,"value":65},"text","Creating a prompt subscription",{"type":58,"tag":67,"props":68,"children":70},"h2",{"id":69},"when-to-use-this",[71],{"type":64,"value":72},"When to use this",{"type":58,"tag":74,"props":75,"children":76},"p",{},[77,79,85,87,94],{"type":64,"value":78},"A ",{"type":58,"tag":80,"props":81,"children":82},"strong",{},[83],{"type":64,"value":84},"subscription",{"type":64,"value":86}," delivers a PostHog report to email or Slack on a recurring\nschedule. There are three kinds, distinguished by which field you set — the kind is\nderived and returned as the read-only ",{"type":58,"tag":88,"props":89,"children":91},"code",{"className":90},[],[92],{"type":64,"value":93},"resource_type",{"type":64,"value":95},":",{"type":58,"tag":97,"props":98,"children":99},"ul",{},[100,123,144],{"type":58,"tag":101,"props":102,"children":103},"li",{},[104,113,115,121],{"type":58,"tag":80,"props":105,"children":106},{},[107],{"type":58,"tag":88,"props":108,"children":110},{"className":109},[],[111],{"type":64,"value":112},"insight",{"type":64,"value":114}," — periodic snapshots of one existing insight (",{"type":58,"tag":88,"props":116,"children":118},{"className":117},[],[119],{"type":64,"value":120},"resource_type: \"insight\"",{"type":64,"value":122},")",{"type":58,"tag":101,"props":124,"children":125},{},[126,135,137,143],{"type":58,"tag":80,"props":127,"children":128},{},[129],{"type":58,"tag":88,"props":130,"children":132},{"className":131},[],[133],{"type":64,"value":134},"dashboard",{"type":64,"value":136}," — periodic snapshots of a dashboard's tiles (",{"type":58,"tag":88,"props":138,"children":140},{"className":139},[],[141],{"type":64,"value":142},"resource_type: \"dashboard\"",{"type":64,"value":122},{"type":58,"tag":101,"props":145,"children":146},{},[147,156,158,163,165,171],{"type":58,"tag":80,"props":148,"children":149},{},[150],{"type":58,"tag":88,"props":151,"children":153},{"className":152},[],[154],{"type":64,"value":155},"prompt",{"type":64,"value":157}," — a recurring ",{"type":58,"tag":80,"props":159,"children":160},{},[161],{"type":64,"value":162},"AI-generated",{"type":64,"value":164}," report from a free-text prompt: an LLM\nplans and runs HogQL over the project's data and synthesizes a fresh markdown report\neach tick (",{"type":58,"tag":88,"props":166,"children":168},{"className":167},[],[169],{"type":64,"value":170},"resource_type: \"ai_prompt\"",{"type":64,"value":122},{"type":58,"tag":74,"props":173,"children":174},{},[175,177,182,184,188,190,196,198,203,205,210,212,217],{"type":64,"value":176},"Use ",{"type":58,"tag":80,"props":178,"children":179},{},[180],{"type":64,"value":181},"this",{"type":64,"value":183}," skill for the ",{"type":58,"tag":80,"props":185,"children":186},{},[187],{"type":64,"value":155},{"type":64,"value":189}," kind — i.e. when the user wants a recurring AI\nsummary of X (on any cadence — daily, weekly, monthly, yearly) rather than a recurring\nsnapshot of one existing insight\u002Fdashboard, or a single one-off report. Pick a prompt subscription when the\nvalue is the ",{"type":58,"tag":191,"props":192,"children":193},"em",{},[194],{"type":64,"value":195},"analysis itself",{"type":64,"value":197}," (the LLM deciding what to query and writing it up),\nnot a fixed chart they already built. For an insight\u002Fdashboard subscription, set\n",{"type":58,"tag":88,"props":199,"children":201},{"className":200},[],[202],{"type":64,"value":112},{"type":64,"value":204},"\u002F",{"type":58,"tag":88,"props":206,"children":208},{"className":207},[],[209],{"type":64,"value":134},{"type":64,"value":211}," instead of ",{"type":58,"tag":88,"props":213,"children":215},{"className":214},[],[216],{"type":64,"value":155},{"type":64,"value":218}," and the AI gates below don't apply.",{"type":58,"tag":74,"props":220,"children":221},{},[222,224,229,231,237],{"type":64,"value":223},"This skill covers ",{"type":58,"tag":80,"props":225,"children":226},{},[227],{"type":64,"value":228},"creating",{"type":64,"value":230}," the subscription. Once it exists you manage its\nlifecycle with the same ",{"type":58,"tag":88,"props":232,"children":234},{"className":233},[],[235],{"type":64,"value":236},"subscriptions-*",{"type":64,"value":238}," tools (see below): list it, edit\u002Fdisable\u002F\nre-enable it, send a test delivery, or delete it.",{"type":58,"tag":67,"props":240,"children":242},{"id":241},"tools",[243],{"type":64,"value":244},"Tools",{"type":58,"tag":246,"props":247,"children":248},"table",{},[249,268],{"type":58,"tag":250,"props":251,"children":252},"thead",{},[253],{"type":58,"tag":254,"props":255,"children":256},"tr",{},[257,263],{"type":58,"tag":258,"props":259,"children":260},"th",{},[261],{"type":64,"value":262},"Tool",{"type":58,"tag":258,"props":264,"children":265},{},[266],{"type":64,"value":267},"Purpose",{"type":58,"tag":269,"props":270,"children":271},"tbody",{},[272,290,307,332,349,366,398],{"type":58,"tag":254,"props":273,"children":274},{},[275,285],{"type":58,"tag":276,"props":277,"children":278},"td",{},[279],{"type":58,"tag":88,"props":280,"children":282},{"className":281},[],[283],{"type":64,"value":284},"posthog:subscriptions-create",{"type":58,"tag":276,"props":286,"children":287},{},[288],{"type":64,"value":289},"Create the recurring prompt subscription",{"type":58,"tag":254,"props":291,"children":292},{},[293,302],{"type":58,"tag":276,"props":294,"children":295},{},[296],{"type":58,"tag":88,"props":297,"children":299},{"className":298},[],[300],{"type":64,"value":301},"posthog:subscriptions-list",{"type":58,"tag":276,"props":303,"children":304},{},[305],{"type":64,"value":306},"Confirm it landed; inspect existing subscriptions",{"type":58,"tag":254,"props":308,"children":309},{},[310,319],{"type":58,"tag":276,"props":311,"children":312},{},[313],{"type":58,"tag":88,"props":314,"children":316},{"className":315},[],[317],{"type":64,"value":318},"posthog:subscriptions-partial-update",{"type":58,"tag":276,"props":320,"children":321},{},[322,324,330],{"type":64,"value":323},"Edit, disable (",{"type":58,"tag":88,"props":325,"children":327},{"className":326},[],[328],{"type":64,"value":329},"enabled: false",{"type":64,"value":331},"), or re-enable it",{"type":58,"tag":254,"props":333,"children":334},{},[335,344],{"type":58,"tag":276,"props":336,"children":337},{},[338],{"type":58,"tag":88,"props":339,"children":341},{"className":340},[],[342],{"type":64,"value":343},"posthog:subscriptions-test-delivery-create",{"type":58,"tag":276,"props":345,"children":346},{},[347],{"type":64,"value":348},"Send an immediate test delivery to its target(s)",{"type":58,"tag":254,"props":350,"children":351},{},[352,361],{"type":58,"tag":276,"props":353,"children":354},{},[355],{"type":58,"tag":88,"props":356,"children":358},{"className":357},[],[359],{"type":64,"value":360},"posthog:subscriptions-delete",{"type":58,"tag":276,"props":362,"children":363},{},[364],{"type":64,"value":365},"Soft-delete it (stops all future deliveries)",{"type":58,"tag":254,"props":367,"children":368},{},[369,378],{"type":58,"tag":276,"props":370,"children":371},{},[372],{"type":58,"tag":88,"props":373,"children":375},{"className":374},[],[376],{"type":64,"value":377},"posthog:integrations-list",{"type":58,"tag":276,"props":379,"children":380},{},[381,383,389,391,397],{"type":64,"value":382},"Find a Slack ",{"type":58,"tag":88,"props":384,"children":386},{"className":385},[],[387],{"type":64,"value":388},"integration_id",{"type":64,"value":390}," (filter ",{"type":58,"tag":88,"props":392,"children":394},{"className":393},[],[395],{"type":64,"value":396},"kind=slack",{"type":64,"value":122},{"type":58,"tag":254,"props":399,"children":400},{},[401,410],{"type":58,"tag":276,"props":402,"children":403},{},[404],{"type":58,"tag":88,"props":405,"children":407},{"className":406},[],[408],{"type":64,"value":409},"posthog:integrations-channels-retrieve",{"type":58,"tag":276,"props":411,"children":412},{},[413],{"type":64,"value":414},"List a Slack integration's channels (id + name)",{"type":58,"tag":67,"props":416,"children":418},{"id":417},"what-you-need-before-calling",[419],{"type":64,"value":420},"What you need before calling",{"type":58,"tag":74,"props":422,"children":423},{},[424],{"type":64,"value":425},"The endpoint enforces three create-time gates and will return 400 if any fails:",{"type":58,"tag":427,"props":428,"children":429},"ol",{},[430,446,464],{"type":58,"tag":101,"props":431,"children":432},{},[433,444],{"type":58,"tag":80,"props":434,"children":435},{},[436,438],{"type":64,"value":437},"PostHog Cloud, or ",{"type":58,"tag":88,"props":439,"children":441},{"className":440},[],[442],{"type":64,"value":443},"DEBUG=true",{"type":64,"value":445}," — self-hosted production deployments are not\neligible (the LLM call routes through a PostHog-managed key).",{"type":58,"tag":101,"props":447,"children":448},{},[449,454,456,462],{"type":58,"tag":80,"props":450,"children":451},{},[452],{"type":64,"value":453},"Org-level \"AI data processing approved\"",{"type":64,"value":455}," — must be toggled on in\n",{"type":58,"tag":88,"props":457,"children":459},{"className":458},[],[460],{"type":64,"value":461},"Org settings → Data → AI data processing",{"type":64,"value":463},". The user must opt in to AI features\nfor the organization first.",{"type":58,"tag":101,"props":465,"children":466},{},[467,472],{"type":58,"tag":80,"props":468,"children":469},{},[470],{"type":64,"value":471},"Prompt subscriptions enabled",{"type":64,"value":473}," for the organization — a PostHog-managed rollout\nflag. If it's off, the org has not been granted access yet; tell the user to\nreach out to PostHog to enable it (there is no self-serve toggle).",{"type":58,"tag":74,"props":475,"children":476},{},[477],{"type":64,"value":478},"If any of the three is missing, stop and tell the user which one to fix —\nre-calling the tool will not help.",{"type":58,"tag":74,"props":480,"children":481},{},[482,484,493,495,501,503,508],{"type":64,"value":483},"Your access token also needs the ",{"type":58,"tag":80,"props":485,"children":486},{},[487],{"type":58,"tag":88,"props":488,"children":490},{"className":489},[],[491],{"type":64,"value":492},"query:read",{"type":64,"value":494}," scope in addition to\n",{"type":58,"tag":88,"props":496,"children":498},{"className":497},[],[499],{"type":64,"value":500},"subscription:write",{"type":64,"value":502},": a prompt subscription runs LLM-generated HogQL over the project's\ndata, so the backend requires query access to create, edit\u002Fre-enable, test-deliver,\nor delete one. A ",{"type":58,"tag":88,"props":504,"children":506},{"className":505},[],[507],{"type":64,"value":500},{"type":64,"value":509},"-only token is rejected with a 403.",{"type":58,"tag":67,"props":511,"children":513},{"id":512},"required-arguments",[514],{"type":64,"value":515},"Required arguments",{"type":58,"tag":517,"props":518,"children":523},"pre",{"className":519,"code":520,"language":521,"meta":522,"style":522},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","prompt: \"...\"                         # ≤4000 chars; setting this (with no insight\u002Fdashboard) makes it a prompt sub → resource_type \"ai_prompt\"\ntarget_type: \"email\" | \"slack\"        # webhook is rejected for prompt subs\ntarget_value: \"...\"                   # comma-separated emails, or \"\u003Cchannel_id>|\u003Cchannel_name>\"\nfrequency: \"daily\" | \"weekly\" | \"monthly\" | \"yearly\"\ninterval: 1                            # 1 = every tick; 2 = every other tick; etc.\nstart_date: \"2026-09-15T09:00:00Z\"   # anchors the recurrence + time-of-day; need not be in the future — the scheduler delivers the next occurrence\ntitle: \"...\"                          # display name in the subscriptions list\n","yaml","",[524],{"type":58,"tag":88,"props":525,"children":526},{"__ignoreMap":522},[527,565,602,632,667,691,722],{"type":58,"tag":528,"props":529,"children":532},"span",{"class":530,"line":531},"line",1,[533,538,543,548,554,559],{"type":58,"tag":528,"props":534,"children":536},{"style":535},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[537],{"type":64,"value":155},{"type":58,"tag":528,"props":539,"children":541},{"style":540},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[542],{"type":64,"value":95},{"type":58,"tag":528,"props":544,"children":545},{"style":540},[546],{"type":64,"value":547}," \"",{"type":58,"tag":528,"props":549,"children":551},{"style":550},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[552],{"type":64,"value":553},"...",{"type":58,"tag":528,"props":555,"children":556},{"style":540},[557],{"type":64,"value":558},"\"",{"type":58,"tag":528,"props":560,"children":562},{"style":561},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[563],{"type":64,"value":564},"                         # ≤4000 chars; setting this (with no insight\u002Fdashboard) makes it a prompt sub → resource_type \"ai_prompt\"\n",{"type":58,"tag":528,"props":566,"children":568},{"class":530,"line":567},2,[569,574,578,582,586,590,596],{"type":58,"tag":528,"props":570,"children":571},{"style":535},[572],{"type":64,"value":573},"target_type",{"type":58,"tag":528,"props":575,"children":576},{"style":540},[577],{"type":64,"value":95},{"type":58,"tag":528,"props":579,"children":580},{"style":540},[581],{"type":64,"value":547},{"type":58,"tag":528,"props":583,"children":584},{"style":550},[585],{"type":64,"value":25},{"type":58,"tag":528,"props":587,"children":588},{"style":540},[589],{"type":64,"value":558},{"type":58,"tag":528,"props":591,"children":593},{"style":592},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[594],{"type":64,"value":595}," |",{"type":58,"tag":528,"props":597,"children":599},{"style":598},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[600],{"type":64,"value":601}," \"slack\"        # webhook is rejected for prompt subs\n",{"type":58,"tag":528,"props":603,"children":605},{"class":530,"line":604},3,[606,611,615,619,623,627],{"type":58,"tag":528,"props":607,"children":608},{"style":535},[609],{"type":64,"value":610},"target_value",{"type":58,"tag":528,"props":612,"children":613},{"style":540},[614],{"type":64,"value":95},{"type":58,"tag":528,"props":616,"children":617},{"style":540},[618],{"type":64,"value":547},{"type":58,"tag":528,"props":620,"children":621},{"style":550},[622],{"type":64,"value":553},{"type":58,"tag":528,"props":624,"children":625},{"style":540},[626],{"type":64,"value":558},{"type":58,"tag":528,"props":628,"children":629},{"style":561},[630],{"type":64,"value":631},"                   # comma-separated emails, or \"\u003Cchannel_id>|\u003Cchannel_name>\"\n",{"type":58,"tag":528,"props":633,"children":635},{"class":530,"line":634},4,[636,641,645,649,654,658,662],{"type":58,"tag":528,"props":637,"children":638},{"style":535},[639],{"type":64,"value":640},"frequency",{"type":58,"tag":528,"props":642,"children":643},{"style":540},[644],{"type":64,"value":95},{"type":58,"tag":528,"props":646,"children":647},{"style":540},[648],{"type":64,"value":547},{"type":58,"tag":528,"props":650,"children":651},{"style":550},[652],{"type":64,"value":653},"daily",{"type":58,"tag":528,"props":655,"children":656},{"style":540},[657],{"type":64,"value":558},{"type":58,"tag":528,"props":659,"children":660},{"style":592},[661],{"type":64,"value":595},{"type":58,"tag":528,"props":663,"children":664},{"style":598},[665],{"type":64,"value":666}," \"weekly\" | \"monthly\" | \"yearly\"\n",{"type":58,"tag":528,"props":668,"children":670},{"class":530,"line":669},5,[671,676,680,686],{"type":58,"tag":528,"props":672,"children":673},{"style":535},[674],{"type":64,"value":675},"interval",{"type":58,"tag":528,"props":677,"children":678},{"style":540},[679],{"type":64,"value":95},{"type":58,"tag":528,"props":681,"children":683},{"style":682},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[684],{"type":64,"value":685}," 1",{"type":58,"tag":528,"props":687,"children":688},{"style":561},[689],{"type":64,"value":690},"                            # 1 = every tick; 2 = every other tick; etc.\n",{"type":58,"tag":528,"props":692,"children":694},{"class":530,"line":693},6,[695,700,704,708,713,717],{"type":58,"tag":528,"props":696,"children":697},{"style":535},[698],{"type":64,"value":699},"start_date",{"type":58,"tag":528,"props":701,"children":702},{"style":540},[703],{"type":64,"value":95},{"type":58,"tag":528,"props":705,"children":706},{"style":540},[707],{"type":64,"value":547},{"type":58,"tag":528,"props":709,"children":710},{"style":550},[711],{"type":64,"value":712},"2026-09-15T09:00:00Z",{"type":58,"tag":528,"props":714,"children":715},{"style":540},[716],{"type":64,"value":558},{"type":58,"tag":528,"props":718,"children":719},{"style":561},[720],{"type":64,"value":721},"   # anchors the recurrence + time-of-day; need not be in the future — the scheduler delivers the next occurrence\n",{"type":58,"tag":528,"props":723,"children":725},{"class":530,"line":724},7,[726,731,735,739,743,747],{"type":58,"tag":528,"props":727,"children":728},{"style":535},[729],{"type":64,"value":730},"title",{"type":58,"tag":528,"props":732,"children":733},{"style":540},[734],{"type":64,"value":95},{"type":58,"tag":528,"props":736,"children":737},{"style":540},[738],{"type":64,"value":547},{"type":58,"tag":528,"props":740,"children":741},{"style":550},[742],{"type":64,"value":553},{"type":58,"tag":528,"props":744,"children":745},{"style":540},[746],{"type":64,"value":558},{"type":58,"tag":528,"props":748,"children":749},{"style":561},[750],{"type":64,"value":751},"                          # display name in the subscriptions list\n",{"type":58,"tag":74,"props":753,"children":754},{},[755,757,762,764,769,771,776,778,783],{"type":64,"value":756},"There is no ",{"type":58,"tag":88,"props":758,"children":760},{"className":759},[],[761],{"type":64,"value":93},{"type":64,"value":763}," argument to send — the kind is ",{"type":58,"tag":80,"props":765,"children":766},{},[767],{"type":64,"value":768},"derived",{"type":64,"value":770},"\nfrom which field you set (",{"type":58,"tag":88,"props":772,"children":774},{"className":773},[],[775],{"type":64,"value":155},{"type":64,"value":777}," ⇒ AI report) and returned as the read-only ",{"type":58,"tag":88,"props":779,"children":781},{"className":780},[],[782],{"type":64,"value":93},{"type":64,"value":784},".",{"type":58,"tag":67,"props":786,"children":788},{"id":787},"optional-arguments",[789],{"type":64,"value":790},"Optional arguments",{"type":58,"tag":517,"props":792,"children":794},{"className":519,"code":793,"language":521,"meta":522,"style":522},"byweekday: ['monday', 'wednesday'] # weekly only — days the rrule fires\nbysetpos: 1 # most useful with monthly; requires byweekday — e.g. byweekday:['monday']+bysetpos:-1 = last Monday\ncount: 10 # cap total deliveries\nuntil_date: '2026-12-31T00:00:00Z' # stop on\u002Fbefore this date\nintegration_id: 42 # Slack only — required; from integrations-list (see \"Slack target\")\n",[795],{"type":58,"tag":88,"props":796,"children":797},{"__ignoreMap":522},[798,858,879,901,931],{"type":58,"tag":528,"props":799,"children":800},{"class":530,"line":531},[801,806,810,815,820,825,829,834,839,844,848,853],{"type":58,"tag":528,"props":802,"children":803},{"style":535},[804],{"type":64,"value":805},"byweekday",{"type":58,"tag":528,"props":807,"children":808},{"style":540},[809],{"type":64,"value":95},{"type":58,"tag":528,"props":811,"children":812},{"style":540},[813],{"type":64,"value":814}," [",{"type":58,"tag":528,"props":816,"children":817},{"style":540},[818],{"type":64,"value":819},"'",{"type":58,"tag":528,"props":821,"children":822},{"style":550},[823],{"type":64,"value":824},"monday",{"type":58,"tag":528,"props":826,"children":827},{"style":540},[828],{"type":64,"value":819},{"type":58,"tag":528,"props":830,"children":831},{"style":540},[832],{"type":64,"value":833},",",{"type":58,"tag":528,"props":835,"children":836},{"style":540},[837],{"type":64,"value":838}," '",{"type":58,"tag":528,"props":840,"children":841},{"style":550},[842],{"type":64,"value":843},"wednesday",{"type":58,"tag":528,"props":845,"children":846},{"style":540},[847],{"type":64,"value":819},{"type":58,"tag":528,"props":849,"children":850},{"style":540},[851],{"type":64,"value":852},"]",{"type":58,"tag":528,"props":854,"children":855},{"style":561},[856],{"type":64,"value":857}," # weekly only — days the rrule fires\n",{"type":58,"tag":528,"props":859,"children":860},{"class":530,"line":567},[861,866,870,874],{"type":58,"tag":528,"props":862,"children":863},{"style":535},[864],{"type":64,"value":865},"bysetpos",{"type":58,"tag":528,"props":867,"children":868},{"style":540},[869],{"type":64,"value":95},{"type":58,"tag":528,"props":871,"children":872},{"style":682},[873],{"type":64,"value":685},{"type":58,"tag":528,"props":875,"children":876},{"style":561},[877],{"type":64,"value":878}," # most useful with monthly; requires byweekday — e.g. byweekday:['monday']+bysetpos:-1 = last Monday\n",{"type":58,"tag":528,"props":880,"children":881},{"class":530,"line":604},[882,887,891,896],{"type":58,"tag":528,"props":883,"children":884},{"style":535},[885],{"type":64,"value":886},"count",{"type":58,"tag":528,"props":888,"children":889},{"style":540},[890],{"type":64,"value":95},{"type":58,"tag":528,"props":892,"children":893},{"style":682},[894],{"type":64,"value":895}," 10",{"type":58,"tag":528,"props":897,"children":898},{"style":561},[899],{"type":64,"value":900}," # cap total deliveries\n",{"type":58,"tag":528,"props":902,"children":903},{"class":530,"line":634},[904,909,913,917,922,926],{"type":58,"tag":528,"props":905,"children":906},{"style":535},[907],{"type":64,"value":908},"until_date",{"type":58,"tag":528,"props":910,"children":911},{"style":540},[912],{"type":64,"value":95},{"type":58,"tag":528,"props":914,"children":915},{"style":540},[916],{"type":64,"value":838},{"type":58,"tag":528,"props":918,"children":919},{"style":550},[920],{"type":64,"value":921},"2026-12-31T00:00:00Z",{"type":58,"tag":528,"props":923,"children":924},{"style":540},[925],{"type":64,"value":819},{"type":58,"tag":528,"props":927,"children":928},{"style":561},[929],{"type":64,"value":930}," # stop on\u002Fbefore this date\n",{"type":58,"tag":528,"props":932,"children":933},{"class":530,"line":669},[934,938,942,947],{"type":58,"tag":528,"props":935,"children":936},{"style":535},[937],{"type":64,"value":388},{"type":58,"tag":528,"props":939,"children":940},{"style":540},[941],{"type":64,"value":95},{"type":58,"tag":528,"props":943,"children":944},{"style":682},[945],{"type":64,"value":946}," 42",{"type":58,"tag":528,"props":948,"children":949},{"style":561},[950],{"type":64,"value":951}," # Slack only — required; from integrations-list (see \"Slack target\")\n",{"type":58,"tag":67,"props":953,"children":955},{"id":954},"slack-target",[956],{"type":64,"value":957},"Slack target",{"type":58,"tag":74,"props":959,"children":960},{},[961,966,968,974],{"type":58,"tag":88,"props":962,"children":964},{"className":963},[],[965],{"type":64,"value":610},{"type":64,"value":967}," must be ",{"type":58,"tag":88,"props":969,"children":971},{"className":970},[],[972],{"type":64,"value":973},"\u003Cchannel_id>|\u003Cchannel_name>",{"type":64,"value":975}," (the format the integration\nreturns). Build it in three steps:",{"type":58,"tag":427,"props":977,"children":978},{},[979,1003,1049],{"type":58,"tag":101,"props":980,"children":981},{},[982,987,989,994,996,1002],{"type":58,"tag":88,"props":983,"children":985},{"className":984},[],[986],{"type":64,"value":377},{"type":64,"value":988}," filtered by ",{"type":58,"tag":88,"props":990,"children":992},{"className":991},[],[993],{"type":64,"value":396},{"type":64,"value":995}," → pick the Slack\nintegration's ",{"type":58,"tag":88,"props":997,"children":999},{"className":998},[],[1000],{"type":64,"value":1001},"id",{"type":64,"value":784},{"type":58,"tag":101,"props":1004,"children":1005},{},[1006,1011,1013,1018,1020,1025,1027,1033,1035,1040,1042,1048],{"type":58,"tag":88,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":64,"value":409},{"type":64,"value":1012}," with that ",{"type":58,"tag":88,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":64,"value":1001},{"type":64,"value":1019}," → pick a channel; it\nreturns each channel's ",{"type":58,"tag":88,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":64,"value":1001},{"type":64,"value":1026}," and ",{"type":58,"tag":88,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":64,"value":1032},"name",{"type":64,"value":1034},", which you assemble into ",{"type":58,"tag":88,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":64,"value":610},{"type":64,"value":1041},"\nas ",{"type":58,"tag":88,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":64,"value":1047},"\u003Cid>|\u003Cname>",{"type":64,"value":784},{"type":58,"tag":101,"props":1050,"children":1051},{},[1052,1054,1059,1061,1066],{"type":64,"value":1053},"Pass that integration's ",{"type":58,"tag":88,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":64,"value":1001},{"type":64,"value":1060}," as ",{"type":58,"tag":88,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":64,"value":388},{"type":64,"value":1067}," — the subscription is pinned\nto one specific Slack integration so reconnections elsewhere don't accidentally\nre-route deliveries.",{"type":58,"tag":67,"props":1069,"children":1071},{"id":1070},"examples",[1072],{"type":64,"value":1073},"Examples",{"type":58,"tag":1075,"props":1076,"children":1078},"h3",{"id":1077},"weekly-monday-morning-ai-summary-by-email",[1079],{"type":64,"value":1080},"Weekly Monday-morning AI summary by email",{"type":58,"tag":517,"props":1082,"children":1084},{"className":519,"code":1083,"language":521,"meta":522,"style":522},"prompt: 'Top events week over week, with the biggest drops and any new failure modes called out.'\ntarget_type: email\ntarget_value: founders@acme.example\nfrequency: weekly\ninterval: 1\nbyweekday: ['monday']\nstart_date: '2026-09-14T08:00:00Z'\ntitle: 'Weekly product pulse'\n",[1085],{"type":58,"tag":88,"props":1086,"children":1087},{"__ignoreMap":522},[1088,1113,1129,1145,1161,1177,1209,1233],{"type":58,"tag":528,"props":1089,"children":1090},{"class":530,"line":531},[1091,1095,1099,1103,1108],{"type":58,"tag":528,"props":1092,"children":1093},{"style":535},[1094],{"type":64,"value":155},{"type":58,"tag":528,"props":1096,"children":1097},{"style":540},[1098],{"type":64,"value":95},{"type":58,"tag":528,"props":1100,"children":1101},{"style":540},[1102],{"type":64,"value":838},{"type":58,"tag":528,"props":1104,"children":1105},{"style":550},[1106],{"type":64,"value":1107},"Top events week over week, with the biggest drops and any new failure modes called out.",{"type":58,"tag":528,"props":1109,"children":1110},{"style":540},[1111],{"type":64,"value":1112},"'\n",{"type":58,"tag":528,"props":1114,"children":1115},{"class":530,"line":567},[1116,1120,1124],{"type":58,"tag":528,"props":1117,"children":1118},{"style":535},[1119],{"type":64,"value":573},{"type":58,"tag":528,"props":1121,"children":1122},{"style":540},[1123],{"type":64,"value":95},{"type":58,"tag":528,"props":1125,"children":1126},{"style":550},[1127],{"type":64,"value":1128}," email\n",{"type":58,"tag":528,"props":1130,"children":1131},{"class":530,"line":604},[1132,1136,1140],{"type":58,"tag":528,"props":1133,"children":1134},{"style":535},[1135],{"type":64,"value":610},{"type":58,"tag":528,"props":1137,"children":1138},{"style":540},[1139],{"type":64,"value":95},{"type":58,"tag":528,"props":1141,"children":1142},{"style":550},[1143],{"type":64,"value":1144}," founders@acme.example\n",{"type":58,"tag":528,"props":1146,"children":1147},{"class":530,"line":634},[1148,1152,1156],{"type":58,"tag":528,"props":1149,"children":1150},{"style":535},[1151],{"type":64,"value":640},{"type":58,"tag":528,"props":1153,"children":1154},{"style":540},[1155],{"type":64,"value":95},{"type":58,"tag":528,"props":1157,"children":1158},{"style":550},[1159],{"type":64,"value":1160}," weekly\n",{"type":58,"tag":528,"props":1162,"children":1163},{"class":530,"line":669},[1164,1168,1172],{"type":58,"tag":528,"props":1165,"children":1166},{"style":535},[1167],{"type":64,"value":675},{"type":58,"tag":528,"props":1169,"children":1170},{"style":540},[1171],{"type":64,"value":95},{"type":58,"tag":528,"props":1173,"children":1174},{"style":682},[1175],{"type":64,"value":1176}," 1\n",{"type":58,"tag":528,"props":1178,"children":1179},{"class":530,"line":693},[1180,1184,1188,1192,1196,1200,1204],{"type":58,"tag":528,"props":1181,"children":1182},{"style":535},[1183],{"type":64,"value":805},{"type":58,"tag":528,"props":1185,"children":1186},{"style":540},[1187],{"type":64,"value":95},{"type":58,"tag":528,"props":1189,"children":1190},{"style":540},[1191],{"type":64,"value":814},{"type":58,"tag":528,"props":1193,"children":1194},{"style":540},[1195],{"type":64,"value":819},{"type":58,"tag":528,"props":1197,"children":1198},{"style":550},[1199],{"type":64,"value":824},{"type":58,"tag":528,"props":1201,"children":1202},{"style":540},[1203],{"type":64,"value":819},{"type":58,"tag":528,"props":1205,"children":1206},{"style":540},[1207],{"type":64,"value":1208},"]\n",{"type":58,"tag":528,"props":1210,"children":1211},{"class":530,"line":724},[1212,1216,1220,1224,1229],{"type":58,"tag":528,"props":1213,"children":1214},{"style":535},[1215],{"type":64,"value":699},{"type":58,"tag":528,"props":1217,"children":1218},{"style":540},[1219],{"type":64,"value":95},{"type":58,"tag":528,"props":1221,"children":1222},{"style":540},[1223],{"type":64,"value":838},{"type":58,"tag":528,"props":1225,"children":1226},{"style":550},[1227],{"type":64,"value":1228},"2026-09-14T08:00:00Z",{"type":58,"tag":528,"props":1230,"children":1231},{"style":540},[1232],{"type":64,"value":1112},{"type":58,"tag":528,"props":1234,"children":1236},{"class":530,"line":1235},8,[1237,1241,1245,1249,1254],{"type":58,"tag":528,"props":1238,"children":1239},{"style":535},[1240],{"type":64,"value":730},{"type":58,"tag":528,"props":1242,"children":1243},{"style":540},[1244],{"type":64,"value":95},{"type":58,"tag":528,"props":1246,"children":1247},{"style":540},[1248],{"type":64,"value":838},{"type":58,"tag":528,"props":1250,"children":1251},{"style":550},[1252],{"type":64,"value":1253},"Weekly product pulse",{"type":58,"tag":528,"props":1255,"children":1256},{"style":540},[1257],{"type":64,"value":1112},{"type":58,"tag":1075,"props":1259,"children":1261},{"id":1260},"daily-slack-report-at-9am",[1262],{"type":64,"value":1263},"Daily Slack report at 9am",{"type":58,"tag":517,"props":1265,"children":1267},{"className":519,"code":1266,"language":521,"meta":522,"style":522},"prompt: \"Yesterday's sign-ups, where they came from, and any errors they hit during onboarding.\"\ntarget_type: slack\ntarget_value: 'C0123456789|growth-updates' # \u003Cchannel_id>|\u003Cchannel_name>; only the channel id is used, the name is cosmetic\nintegration_id: 42\nfrequency: daily\ninterval: 1\nstart_date: '2026-09-15T09:00:00Z'\ntitle: 'Daily onboarding watch'\n",[1268],{"type":58,"tag":88,"props":1269,"children":1270},{"__ignoreMap":522},[1271,1296,1312,1341,1357,1373,1388,1411],{"type":58,"tag":528,"props":1272,"children":1273},{"class":530,"line":531},[1274,1278,1282,1286,1291],{"type":58,"tag":528,"props":1275,"children":1276},{"style":535},[1277],{"type":64,"value":155},{"type":58,"tag":528,"props":1279,"children":1280},{"style":540},[1281],{"type":64,"value":95},{"type":58,"tag":528,"props":1283,"children":1284},{"style":540},[1285],{"type":64,"value":547},{"type":58,"tag":528,"props":1287,"children":1288},{"style":550},[1289],{"type":64,"value":1290},"Yesterday's sign-ups, where they came from, and any errors they hit during onboarding.",{"type":58,"tag":528,"props":1292,"children":1293},{"style":540},[1294],{"type":64,"value":1295},"\"\n",{"type":58,"tag":528,"props":1297,"children":1298},{"class":530,"line":567},[1299,1303,1307],{"type":58,"tag":528,"props":1300,"children":1301},{"style":535},[1302],{"type":64,"value":573},{"type":58,"tag":528,"props":1304,"children":1305},{"style":540},[1306],{"type":64,"value":95},{"type":58,"tag":528,"props":1308,"children":1309},{"style":550},[1310],{"type":64,"value":1311}," slack\n",{"type":58,"tag":528,"props":1313,"children":1314},{"class":530,"line":604},[1315,1319,1323,1327,1332,1336],{"type":58,"tag":528,"props":1316,"children":1317},{"style":535},[1318],{"type":64,"value":610},{"type":58,"tag":528,"props":1320,"children":1321},{"style":540},[1322],{"type":64,"value":95},{"type":58,"tag":528,"props":1324,"children":1325},{"style":540},[1326],{"type":64,"value":838},{"type":58,"tag":528,"props":1328,"children":1329},{"style":550},[1330],{"type":64,"value":1331},"C0123456789|growth-updates",{"type":58,"tag":528,"props":1333,"children":1334},{"style":540},[1335],{"type":64,"value":819},{"type":58,"tag":528,"props":1337,"children":1338},{"style":561},[1339],{"type":64,"value":1340}," # \u003Cchannel_id>|\u003Cchannel_name>; only the channel id is used, the name is cosmetic\n",{"type":58,"tag":528,"props":1342,"children":1343},{"class":530,"line":634},[1344,1348,1352],{"type":58,"tag":528,"props":1345,"children":1346},{"style":535},[1347],{"type":64,"value":388},{"type":58,"tag":528,"props":1349,"children":1350},{"style":540},[1351],{"type":64,"value":95},{"type":58,"tag":528,"props":1353,"children":1354},{"style":682},[1355],{"type":64,"value":1356}," 42\n",{"type":58,"tag":528,"props":1358,"children":1359},{"class":530,"line":669},[1360,1364,1368],{"type":58,"tag":528,"props":1361,"children":1362},{"style":535},[1363],{"type":64,"value":640},{"type":58,"tag":528,"props":1365,"children":1366},{"style":540},[1367],{"type":64,"value":95},{"type":58,"tag":528,"props":1369,"children":1370},{"style":550},[1371],{"type":64,"value":1372}," daily\n",{"type":58,"tag":528,"props":1374,"children":1375},{"class":530,"line":693},[1376,1380,1384],{"type":58,"tag":528,"props":1377,"children":1378},{"style":535},[1379],{"type":64,"value":675},{"type":58,"tag":528,"props":1381,"children":1382},{"style":540},[1383],{"type":64,"value":95},{"type":58,"tag":528,"props":1385,"children":1386},{"style":682},[1387],{"type":64,"value":1176},{"type":58,"tag":528,"props":1389,"children":1390},{"class":530,"line":724},[1391,1395,1399,1403,1407],{"type":58,"tag":528,"props":1392,"children":1393},{"style":535},[1394],{"type":64,"value":699},{"type":58,"tag":528,"props":1396,"children":1397},{"style":540},[1398],{"type":64,"value":95},{"type":58,"tag":528,"props":1400,"children":1401},{"style":540},[1402],{"type":64,"value":838},{"type":58,"tag":528,"props":1404,"children":1405},{"style":550},[1406],{"type":64,"value":712},{"type":58,"tag":528,"props":1408,"children":1409},{"style":540},[1410],{"type":64,"value":1112},{"type":58,"tag":528,"props":1412,"children":1413},{"class":530,"line":1235},[1414,1418,1422,1426,1431],{"type":58,"tag":528,"props":1415,"children":1416},{"style":535},[1417],{"type":64,"value":730},{"type":58,"tag":528,"props":1419,"children":1420},{"style":540},[1421],{"type":64,"value":95},{"type":58,"tag":528,"props":1423,"children":1424},{"style":540},[1425],{"type":64,"value":838},{"type":58,"tag":528,"props":1427,"children":1428},{"style":550},[1429],{"type":64,"value":1430},"Daily onboarding watch",{"type":58,"tag":528,"props":1432,"children":1433},{"style":540},[1434],{"type":64,"value":1112},{"type":58,"tag":67,"props":1436,"children":1438},{"id":1437},"pitfalls",[1439],{"type":64,"value":1440},"Pitfalls",{"type":58,"tag":97,"props":1442,"children":1443},{},[1444,1461,1493,1523],{"type":58,"tag":101,"props":1445,"children":1446},{},[1447,1452,1454,1459],{"type":58,"tag":80,"props":1448,"children":1449},{},[1450],{"type":64,"value":1451},"The kind is immutable.",{"type":64,"value":1453}," It's derived from which relation is set, so you can't flip an\ninsight or dashboard sub into a prompt sub after the fact (or vice versa) — a PATCH that adds a\n",{"type":58,"tag":88,"props":1455,"children":1457},{"className":1456},[],[1458],{"type":64,"value":155},{"type":64,"value":1460}," to an insight sub is rejected. Pick the right kind at create time.",{"type":58,"tag":101,"props":1462,"children":1463},{},[1464,1469,1471,1476,1478,1484,1486,1491],{"type":58,"tag":80,"props":1465,"children":1466},{},[1467],{"type":64,"value":1468},"Re-enabling a previously auto-disabled prompt sub",{"type":64,"value":1470}," has two preconditions, both\nenforced on the PATCH: (1) a valid ",{"type":58,"tag":88,"props":1472,"children":1474},{"className":1473},[],[1475],{"type":64,"value":155},{"type":64,"value":1477}," — already persisted on the row, or a\nnew one in the PATCH body (so bare ",{"type":58,"tag":88,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":64,"value":1483},"{\"enabled\": true}",{"type":64,"value":1485}," works when the stored prompt\nis still valid, but is rejected when the disable cause was an invalid prompt until\nyou supply a good one); and (2) the ",{"type":58,"tag":80,"props":1487,"children":1488},{},[1489],{"type":64,"value":1490},"original creator is still an active user",{"type":64,"value":1492}," —\nif that account was deactivated the sub cannot be re-enabled at all (no prompt will\nhelp; re-create it instead).",{"type":58,"tag":101,"props":1494,"children":1495},{},[1496,1507,1509,1514,1516,1521],{"type":58,"tag":80,"props":1497,"children":1498},{},[1499,1505],{"type":58,"tag":88,"props":1500,"children":1502},{"className":1501},[],[1503],{"type":64,"value":1504},"next_delivery_date",{"type":64,"value":1506}," is server-computed from the rrule.",{"type":64,"value":1508}," Don't try to set it\nmanually — it's read-only. The first delivery fires at the first ",{"type":58,"tag":88,"props":1510,"children":1512},{"className":1511},[],[1513],{"type":64,"value":699},{"type":64,"value":1515},"\noccurrence that is at least a short buffer (currently ~15 minutes) in the future,\nso a ",{"type":58,"tag":88,"props":1517,"children":1519},{"className":1518},[],[1520],{"type":64,"value":699},{"type":64,"value":1522}," only seconds ahead rolls to the next occurrence.",{"type":58,"tag":101,"props":1524,"children":1525},{},[1526,1531,1533,1538,1540,1545],{"type":58,"tag":80,"props":1527,"children":1528},{},[1529],{"type":64,"value":1530},"Transient send failures retry; only permanent failures auto-disable.",{"type":64,"value":1532}," A\ntransient failure (Slack rate limit, SMTP blip, network) fails that delivery and\nis retried by Temporal within the run, then re-fires on the next scheduled tick —\nit does ",{"type":58,"tag":80,"props":1534,"children":1535},{},[1536],{"type":64,"value":1537},"not",{"type":64,"value":1539}," auto-disable the subscription, so a persistently-failing channel\nwill keep retrying every tick until you fix it. Only permanent\u002Fstructural causes\nauto-disable: a disconnected Slack integration, a revoked channel permission, an\ninvalid prompt, or revoked AI data-processing consent. (For multi-recipient email,\na delivery only fails when ",{"type":58,"tag":191,"props":1541,"children":1542},{},[1543],{"type":64,"value":1544},"every",{"type":64,"value":1546}," recipient fails; partial successes still send.)\nWithin a single delivery run the rendered markdown is cached, so Temporal retries\nof that run don't re-run the LLM pipeline — but each new scheduled tick generates a\nfresh report.",{"type":58,"tag":67,"props":1548,"children":1550},{"id":1549},"after-it-lands",[1551],{"type":64,"value":1552},"After it lands",{"type":58,"tag":74,"props":1554,"children":1555},{},[1556,1562,1564,1569,1571,1577,1579,1584,1586,1591],{"type":58,"tag":88,"props":1557,"children":1559},{"className":1558},[],[1560],{"type":64,"value":1561},"subscriptions-list",{"type":64,"value":1563}," will return the new row. Confirm ",{"type":58,"tag":88,"props":1565,"children":1567},{"className":1566},[],[1568],{"type":64,"value":170},{"type":64,"value":1570},",\n",{"type":58,"tag":88,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":64,"value":1576},"enabled: true",{"type":64,"value":1578},", ",{"type":58,"tag":88,"props":1580,"children":1582},{"className":1581},[],[1583],{"type":64,"value":1504},{"type":64,"value":1585}," is in the future, and ",{"type":58,"tag":88,"props":1587,"children":1589},{"className":1588},[],[1590],{"type":64,"value":155},{"type":64,"value":1592}," matches what\nyou sent. The first scheduled tick will run the planner → HogQL → synthesis\npipeline and email\u002FSlack the rendered markdown.",{"type":58,"tag":1594,"props":1595,"children":1596},"style",{},[1597],{"type":64,"value":1598},"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":1600,"total":1700},[1601,1617,1629,1641,1654,1669,1685],{"slug":1602,"name":1602,"fn":1603,"description":1604,"org":1605,"tags":1606,"stars":26,"repoUrl":27,"updatedAt":1616},"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},[1607,1609,1612,1615],{"name":1608,"slug":34,"type":13},"Analytics",{"name":1610,"slug":1611,"type":13},"Cost Optimization","cost-optimization",{"name":1613,"slug":1614,"type":13},"Observability","observability",{"name":9,"slug":8,"type":13},"2026-07-28T05:34:11.117757",{"slug":1618,"name":1618,"fn":1619,"description":1620,"org":1621,"tags":1622,"stars":26,"repoUrl":27,"updatedAt":1628},"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},[1623,1624,1627],{"name":1608,"slug":34,"type":13},{"name":1625,"slug":1626,"type":13},"Audit","audit",{"name":9,"slug":8,"type":13},"2026-06-08T08:08:33.693989",{"slug":1630,"name":1630,"fn":1631,"description":1632,"org":1633,"tags":1634,"stars":26,"repoUrl":27,"updatedAt":1640},"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},[1635,1636,1638,1639],{"name":1625,"slug":1626,"type":13},{"name":1637,"slug":36,"type":13},"Data Warehouse",{"name":1613,"slug":1614,"type":13},{"name":9,"slug":8,"type":13},"2026-06-18T08:22:57.67984",{"slug":1642,"name":1642,"fn":1643,"description":1644,"org":1645,"tags":1646,"stars":26,"repoUrl":27,"updatedAt":1653},"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},[1647,1648,1649,1652],{"name":1625,"slug":1626,"type":13},{"name":1637,"slug":36,"type":13},{"name":1650,"slug":1651,"type":13},"Performance","performance",{"name":9,"slug":8,"type":13},"2026-06-18T08:25:10.936787",{"slug":1655,"name":1655,"fn":1656,"description":1657,"org":1658,"tags":1659,"stars":26,"repoUrl":27,"updatedAt":1668},"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},[1660,1663,1666,1667],{"name":1661,"slug":1662,"type":13},"Alerting","alerting",{"name":1664,"slug":1665,"type":13},"Debugging","debugging",{"name":1613,"slug":1614,"type":13},{"name":9,"slug":8,"type":13},"2026-06-18T08:24:40.318583",{"slug":1670,"name":1670,"fn":1671,"description":1672,"org":1673,"tags":1674,"stars":26,"repoUrl":27,"updatedAt":1684},"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},[1675,1676,1679,1680,1683],{"name":1608,"slug":34,"type":13},{"name":1677,"slug":1678,"type":13},"Monitoring","monitoring",{"name":1613,"slug":1614,"type":13},{"name":1681,"slug":1682,"type":13},"Operations","operations",{"name":9,"slug":8,"type":13},"2026-07-18T05:10:54.430898",{"slug":1686,"name":1686,"fn":1687,"description":1688,"org":1689,"tags":1690,"stars":26,"repoUrl":27,"updatedAt":1699},"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},[1691,1692,1695,1696],{"name":18,"slug":19,"type":13},{"name":1693,"slug":1694,"type":13},"MCP","mcp",{"name":9,"slug":8,"type":13},{"name":1697,"slug":1698,"type":13},"Workflow Automation","workflow-automation","2026-07-28T05:34:12.167015",61,{"items":1702,"total":1809},[1703,1710,1716,1723,1730,1737,1745,1752,1766,1781,1791,1799],{"slug":1602,"name":1602,"fn":1603,"description":1604,"org":1704,"tags":1705,"stars":26,"repoUrl":27,"updatedAt":1616},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1706,1707,1708,1709],{"name":1608,"slug":34,"type":13},{"name":1610,"slug":1611,"type":13},{"name":1613,"slug":1614,"type":13},{"name":9,"slug":8,"type":13},{"slug":1618,"name":1618,"fn":1619,"description":1620,"org":1711,"tags":1712,"stars":26,"repoUrl":27,"updatedAt":1628},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1713,1714,1715],{"name":1608,"slug":34,"type":13},{"name":1625,"slug":1626,"type":13},{"name":9,"slug":8,"type":13},{"slug":1630,"name":1630,"fn":1631,"description":1632,"org":1717,"tags":1718,"stars":26,"repoUrl":27,"updatedAt":1640},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1719,1720,1721,1722],{"name":1625,"slug":1626,"type":13},{"name":1637,"slug":36,"type":13},{"name":1613,"slug":1614,"type":13},{"name":9,"slug":8,"type":13},{"slug":1642,"name":1642,"fn":1643,"description":1644,"org":1724,"tags":1725,"stars":26,"repoUrl":27,"updatedAt":1653},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1726,1727,1728,1729],{"name":1625,"slug":1626,"type":13},{"name":1637,"slug":36,"type":13},{"name":1650,"slug":1651,"type":13},{"name":9,"slug":8,"type":13},{"slug":1655,"name":1655,"fn":1656,"description":1657,"org":1731,"tags":1732,"stars":26,"repoUrl":27,"updatedAt":1668},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1733,1734,1735,1736],{"name":1661,"slug":1662,"type":13},{"name":1664,"slug":1665,"type":13},{"name":1613,"slug":1614,"type":13},{"name":9,"slug":8,"type":13},{"slug":1670,"name":1670,"fn":1671,"description":1672,"org":1738,"tags":1739,"stars":26,"repoUrl":27,"updatedAt":1684},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1740,1741,1742,1743,1744],{"name":1608,"slug":34,"type":13},{"name":1677,"slug":1678,"type":13},{"name":1613,"slug":1614,"type":13},{"name":1681,"slug":1682,"type":13},{"name":9,"slug":8,"type":13},{"slug":1686,"name":1686,"fn":1687,"description":1688,"org":1746,"tags":1747,"stars":26,"repoUrl":27,"updatedAt":1699},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1748,1749,1750,1751],{"name":18,"slug":19,"type":13},{"name":1693,"slug":1694,"type":13},{"name":9,"slug":8,"type":13},{"name":1697,"slug":1698,"type":13},{"slug":1753,"name":1753,"fn":1754,"description":1755,"org":1756,"tags":1757,"stars":26,"repoUrl":27,"updatedAt":1765},"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},[1758,1759,1760,1763,1764],{"name":1608,"slug":34,"type":13},{"name":1664,"slug":1665,"type":13},{"name":1761,"slug":1762,"type":13},"Frontend","frontend",{"name":1613,"slug":1614,"type":13},{"name":9,"slug":8,"type":13},"2026-05-07T05:56:19.828048",{"slug":1767,"name":1767,"fn":1768,"description":1769,"org":1770,"tags":1771,"stars":26,"repoUrl":27,"updatedAt":1780},"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},[1772,1775,1776,1777],{"name":1773,"slug":1774,"type":13},"API Development","api-development",{"name":1761,"slug":1762,"type":13},{"name":9,"slug":8,"type":13},{"name":1778,"slug":1779,"type":13},"SDK","sdk","2026-06-08T08:08:34.929454",{"slug":1782,"name":1782,"fn":1783,"description":1784,"org":1785,"tags":1786,"stars":26,"repoUrl":27,"updatedAt":1790},"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},[1787,1788,1789],{"name":1773,"slug":1774,"type":13},{"name":1681,"slug":1682,"type":13},{"name":9,"slug":8,"type":13},"2026-07-15T05:29:58.442727",{"slug":4,"name":4,"fn":5,"description":6,"org":1792,"tags":1793,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1794,1795,1796,1797,1798],{"name":18,"slug":19,"type":13},{"name":24,"slug":25,"type":13},{"name":9,"slug":8,"type":13},{"name":15,"slug":16,"type":13},{"name":21,"slug":22,"type":13},{"slug":1800,"name":1800,"fn":1801,"description":1802,"org":1803,"tags":1804,"stars":26,"repoUrl":27,"updatedAt":1808},"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},[1805,1806,1807],{"name":1608,"slug":34,"type":13},{"name":1773,"slug":1774,"type":13},{"name":9,"slug":8,"type":13},"2026-06-08T08:08:29.624498",231]