Managing reminders
This skill guides you through creating and managing PostHog reminders.
A reminder is a private, human-paced nudge to yourself: it fires an in-app notification
on a schedule, with no condition attached. It can optionally link to a PostHog resource.
When to use this skill
Use this skill when the user:
- Says "remind me to…", "nudge me", "ping me", or "don't let me forget"
- Wants a one-off reminder at a specific date/time
- Wants a recurring reminder (every day, weekly, every Monday, weekdays, monthly, etc.)
- Wants to be reminded to review a specific dashboard, insight, experiment, flag, survey, notebook, replay, or error
- Wants to see, change, or cancel reminders they have set
Reminder vs alert vs subscription
These three look similar but solve different jobs. Pick the right one:
- Reminder — a human-paced nudge to yourself with no condition. It just fires an
in-app notification on a schedule ("remind me to review the launch dashboard every Monday").
If the user says "remind me to…", it is a reminder.
- Alert — watches an insight's metric on a schedule and notifies only when a
threshold or anomaly condition is met ("tell me if signups drop below 100").
- Subscription — delivers an insight or dashboard export/snapshot on a schedule via
email, Slack, or webhook ("email me this dashboard every morning").
If there is a condition to evaluate, it is an alert. If there is an export to deliver, it is a
subscription. If it is just a timed nudge to a person, it is a reminder.
Scheduling shapes
A reminder uses exactly one of scheduled_at, recurrence_interval, or cron_expression.
Providing zero or more than one is rejected.
One-off
Set scheduled_at to a future ISO 8601 timestamp. The reminder fires once, then becomes completed.
| User says |
Field |
| "remind me tomorrow at 3pm" |
scheduled_at: <tomorrow 15:00 in the user's tz> |
| "remind me on Jan 5 at 9am" |
scheduled_at: "2026-01-05T09:00:00" (+ timezone) |
Preset recurring
Set recurrence_interval to one of daily, weekly, monthly, yearly.
| User says |
Field |
| "every day" |
recurrence_interval: "daily" |
| "every week" |
recurrence_interval: "weekly" |
| "every month" |
recurrence_interval: "monthly" |
| "every year" |
recurrence_interval: "yearly" |
Cron recurring
Set cron_expression to a 5-field cron string (min hour day-of-month month day-of-week) when
the cadence is a specific weekday or time the presets can't express.
| User says |
Field |
| "every Monday at 9am" |
cron_expression: "0 9 * * 1" |
| "weekdays at 8:30" |
cron_expression: "30 8 * * 1-5" |
| "1st of the month at noon" |
cron_expression: "0 12 1 * *" |
A reminder may fire at most 4 times per day — a more frequent cron (e.g. hourly) is rejected.
Timezone
Always pass timezone as the user's IANA zone (e.g. "America/New_York") when you know it, so
wall-clock times like "9am" resolve to the right moment. If omitted, it defaults to the project
timezone. Cron and preset schedules resolve in this zone; scheduled_at is an absolute instant,
so include its offset or rely on the same zone.
Attaching a resource
To link the reminder to a PostHog object, set resource_type and resource_id together.
The fired notification deep-links to that object. The resource must already exist in the project.
resource_type |
resource_id is the… |
dashboard |
numeric id |
insight |
short_id |
experiment |
numeric id |
feature_flag |
numeric id |
survey |
id |
notebook |
short_id |
replay |
session_id |
error_tracking |
issue id |
Resolve the id first if the user gives you a name or URL (e.g. fetch the insight to get its
short_id). Omit both fields for a standalone reminder with no linked resource.
Privacy and lifecycle
- Reminders are private to the creating user and scoped to the current project. Other
users never see them.
- They fire as in-app notifications — not email, Slack, or webhook.
- A one-off becomes
completed after it fires.
- A recurring reminder stays
active until deleted, or until its optional end_date passes
(then it becomes completed).
- A one-off whose delivery permanently fails becomes
errored — surface this via reminders-list
when reporting on a user's reminders.
The MCP tools
reminder-create — create a reminder
reminders-list — list the user's reminders (schedule, status, next fire time)
reminder-get — get one reminder by id
reminder-update — update title, message, schedule, timezone, end date, or attached resource
(changing the schedule recomputes the next fire time)
reminder-delete — delete a reminder, which stops it firing
Worked example
User: "Remind me to review the launch dashboard every Monday at 9am."
- Resolve the dashboard id (e.g. dashboard
67).
- Pick the schedule shape: a specific weekday + time → cron.
- Pass the user's timezone if known.
- Call
reminder-create:
{
"title": "Review the launch dashboard",
"resource_type": "dashboard",
"resource_id": "67",
"cron_expression": "0 9 * * 1",
"timezone": "America/New_York"
}
Confirm back to the user when it will next fire (use next_fire_at from the response), and that
it will keep firing weekly until they delete it.
1---2name: managing-reminders3description: Create and manage PostHog reminders — private, human-paced nudges that fire as in-app notifications on a schedule, optionally linked to a PostHog resource. Use when the user says "remind me to…", wants a one-off or recurring nudge (daily/weekly/monthly/yearly, a cron schedule, or a specific date/time), wants to be reminded to look at a dashboard, insight, experiment, feature flag, survey, notebook, replay, or error, or wants to list, change, or cancel their reminders. Covers when to pick a reminder over an alert or subscription, the one-off vs recurring vs cron schedule field mappings, timezones, and attaching a resource.4---5
6# Managing reminders
7
8This skill guides you through creating and managing PostHog reminders.
9A reminder is a private, human-paced nudge to yourself: it fires an in-app notification
10on a schedule, with no condition attached. It can optionally link to a PostHog resource.
11
12## When to use this skill
13
14Use this skill when the user:
15
16- Says "remind me to…", "nudge me", "ping me", or "don't let me forget"
17- Wants a one-off reminder at a specific date/time
18- Wants a recurring reminder (every day, weekly, every Monday, weekdays, monthly, etc.)
19- Wants to be reminded to review a specific dashboard, insight, experiment, flag, survey, notebook, replay, or error
20- Wants to see, change, or cancel reminders they have set
21
22## Reminder vs alert vs subscription
23
24These three look similar but solve different jobs. Pick the right one:
25
26- **Reminder** — a human-paced nudge to yourself with **no condition**. It just fires an
27 in-app notification on a schedule ("remind me to review the launch dashboard every Monday").
28 If the user says **"remind me to…"**, it is a reminder.
29- **Alert** — watches an insight's metric on a schedule and notifies only when a
30 **threshold or anomaly condition is met** ("tell me if signups drop below 100").
31- **Subscription** — delivers an insight or dashboard **export/snapshot** on a schedule via
32 email, Slack, or webhook ("email me this dashboard every morning").
33
34If there is a condition to evaluate, it is an alert. If there is an export to deliver, it is a
35subscription. If it is just a timed nudge to a person, it is a reminder.
36
37## Scheduling shapes
38
39A reminder uses **exactly one** of `scheduled_at`, `recurrence_interval`, or `cron_expression`.
40Providing zero or more than one is rejected.
41
42### One-off
43
44Set `scheduled_at` to a future ISO 8601 timestamp. The reminder fires once, then becomes `completed`.
45
46| User says | Field |
47| --------------------------- | ---------------------------------------------------- |
48| "remind me tomorrow at 3pm" | `scheduled_at: <tomorrow 15:00 in the user's tz>` |
49| "remind me on Jan 5 at 9am" | `scheduled_at: "2026-01-05T09:00:00"` (+ `timezone`) |
50
51### Preset recurring
52
53Set `recurrence_interval` to one of `daily`, `weekly`, `monthly`, `yearly`.
54
55| User says | Field |
56| ------------- | -------------------------------- |
57| "every day" | `recurrence_interval: "daily"` |
58| "every week" | `recurrence_interval: "weekly"` |
59| "every month" | `recurrence_interval: "monthly"` |
60| "every year" | `recurrence_interval: "yearly"` |
61
62### Cron recurring
63
64Set `cron_expression` to a 5-field cron string (`min hour day-of-month month day-of-week`) when
65the cadence is a specific weekday or time the presets can't express.
66
67| User says | Field |
68| -------------------------- | --------------------------------- |
69| "every Monday at 9am" | `cron_expression: "0 9 * * 1"` |
70| "weekdays at 8:30" | `cron_expression: "30 8 * * 1-5"` |
71| "1st of the month at noon" | `cron_expression: "0 12 1 * *"` |
72
73A reminder may fire **at most 4 times per day** — a more frequent cron (e.g. hourly) is rejected.
74
75## Timezone
76
77Always pass `timezone` as the user's IANA zone (e.g. `"America/New_York"`) when you know it, so
78wall-clock times like "9am" resolve to the right moment. If omitted, it defaults to the **project
79timezone**. Cron and preset schedules resolve in this zone; `scheduled_at` is an absolute instant,
80so include its offset or rely on the same zone.
81
82## Attaching a resource
83
84To link the reminder to a PostHog object, set `resource_type` and `resource_id` **together**.
85The fired notification deep-links to that object. The resource must already exist in the project.
86
87| `resource_type` | `resource_id` is the… |
88| ---------------- | --------------------- |
89| `dashboard` | numeric id |
90| `insight` | short_id |
91| `experiment` | numeric id |
92| `feature_flag` | numeric id |
93| `survey` | id |
94| `notebook` | short_id |
95| `replay` | session_id |
96| `error_tracking` | issue id |
97
98Resolve the id first if the user gives you a name or URL (e.g. fetch the insight to get its
99`short_id`). Omit both fields for a standalone reminder with no linked resource.
100
101## Privacy and lifecycle
102
103- Reminders are **private to the creating user** and scoped to the **current project**. Other
104 users never see them.
105- They fire as **in-app notifications** — not email, Slack, or webhook.
106- A **one-off** becomes `completed` after it fires.
107- A **recurring** reminder stays `active` until deleted, or until its optional `end_date` passes
108 (then it becomes `completed`).
109- A one-off whose delivery permanently fails becomes `errored` — surface this via `reminders-list`
110 when reporting on a user's reminders.
111
112## The MCP tools
113
114- `reminder-create` — create a reminder
115- `reminders-list` — list the user's reminders (schedule, status, next fire time)
116- `reminder-get` — get one reminder by id
117- `reminder-update` — update title, message, schedule, timezone, end date, or attached resource
118 (changing the schedule recomputes the next fire time)
119- `reminder-delete` — delete a reminder, which stops it firing
120
121## Worked example
122
123User: "Remind me to review the launch dashboard every Monday at 9am."
124
1251. Resolve the dashboard id (e.g. dashboard `67`).
1262. Pick the schedule shape: a specific weekday + time → cron.
1273. Pass the user's timezone if known.
1284. Call `reminder-create`:
129
130```json
131{
132 "title": "Review the launch dashboard",
133 "resource_type": "dashboard",
134 "resource_id": "67",
135 "cron_expression": "0 9 * * 1",
136 "timezone": "America/New_York"
137}
138```
139
140Confirm back to the user when it will next fire (use `next_fire_at` from the response), and that
141it will keep firing weekly until they delete it.