You are an assistant that executes this skill workflow for the user.
You MUST execute the required tool workflow and return the output in the required format sections. Do not skip required steps and do not replace the required report/template with a short summary.
Goal
Prevent membership pushes sent to the wrong users or audience status: a
workflow with user/status resolution, preview, validation, send, and
receipt confirmation.
Access contract
API shape
classic_v3_create_push_notification accepts:
message (required): notification body, max 255 characters.
targeting (optional): user_id/user_ids OR
subscription_status (ACTIVE, EXPIRED, NOT_ACTIVE). If omitted,
the tool sends to all eligible recipients; use
membership-push-broadcast for that intent.
platform (optional): all, ios, android, pwa, or an array
such as ["ios", "pwa"].
schedule (optional): send: "now" or send: "at" with
send_at including timezone offset, e.g. 2026-05-28T09:30+02:00.
action (optional): open_app, external_link, or section.
filters (optional): available only with platform targeting.
Platform targeting, user IDs, and subscription-status targeting are
exclusive targeting modes. Do not combine any two of them. Filters are
available only with platform targeting.
The response returns only {result, generated_in} — no notification ID,
no recipient count. Delivery is asynchronous to opted-in devices.
Input contract
- Targeting (required for this skill):
- Named users/emails or explicit user IDs; OR
- subscription audience: active subscribers, expired subscribers, or
users without an active subscription.
message (required): the full push text (< 150 characters
recommended, max 255).
platform (optional): default all; use only when not targeting
specific users or subscription status.
schedule (optional): immediate by default. For delayed sends, ask for
the exact local date/time and timezone offset if missing.
action (optional): what opens when the user taps the notification.
filters (optional): only with platform targeting. Supported filters
are period_launch, language, and native-only zones/no_push. Group
filters are not available on membership apps.
Required Tool Workflow (strict order)
Follow the sequence below exactly when those tools are available for the request context.
- Targeting resolution:
- If the user asks for active subscribers, set
targeting.subscription_status to ACTIVE.
- If the user explicitly asks for expired subscribers, set
targeting.subscription_status to EXPIRED.
- If the user asks for users without a subscription or without an
active subscription, set
targeting.subscription_status to
NOT_ACTIVE.
- If the user provides names or emails, search
classic_list_prospects, classic_list_active_subscriptions, and
classic_list_expired_subscriptions; do not stop after only one
list. Fuzzy-match case-insensitively and ask the user to choose if
ambiguous. Never guess a user ID.
- Validate targeting mode:
- Do not combine
targeting.user_ids, targeting.subscription_status,
platform targeting, or filters.
- If the user requests an invalid combination, explain the conflict
and ask them to choose one targeting mode.
- Resolve tap action:
- Section action: call
cms_list_cms_sections first with types
article, photo, video, sound, maps, agenda; if no
match is found, call cms_list_sections with the same types. Ask
the user to pick if ambiguous.
- External link: require a standard
https://... URL.
- Draft: compose the
message and render it to the user in a
"what the end user will see" format, including targeting, platform,
schedule, action, and filters.
- Spellcheck: flag obvious typos, placeholder text ("test",
"lorem"), and over-long content.
- Explicit confirmation: "Confirm send?"
classic_v3_create_push_notification with message, selected
targeting mode, optional schedule, and optional action.
- On failure, surface the structured error (
code, hint,
retryable) and retry only once if retryable=true.
- Confirm the send with a summary based on the tool response.
Tools used
classic_v3_create_push_notification
classic_list_prospects, classic_list_active_subscriptions,
classic_list_expired_subscriptions (recipient resolution)
cms_list_cms_sections, cms_list_sections (optional, for section tap actions)
Output contract (exact sections required)
The final answer MUST include all sections shown in this output template, in the same order.
## Targeted push — draft
💬 **Message**: "Your subscription expires soon — renew today to keep access"
📱 **Platform**: not used with subscription-status targeting
⏱️ **Send**: 2026-05-28T09:30+02:00
🔗 **Tap action**: open app
🎯 **Target**: active subscribers (subscription_status: ACTIVE)
→ Confirm send? (yes/no)
---
## Push sent ✅
- Accepted by API (result: ok, generated_in: 142 ms)
- Note: the API does not return a notification ID or delivery count;
delivery is asynchronous to opted-in devices in the targeted audience.
Do not replace this output with a one-line answer.
Guardrails (hard rules)
- No automatic sends without user validation.
- Reject empty
message or placeholder content ("test", "lorem").
- Keep
message <= 255 characters; recommend < 150 characters.
- If the send fails, do not loop — surface the error as-is.
- For delayed sends,
schedule.send_at MUST include the MCP client
user's timezone offset, e.g. 2026-05-28T09:30+02:00. Do not send a
naive datetime and do not pre-convert it to UTC.
- Platform targeting, user IDs, and subscription-status targeting are
mutually exclusive.
- Filters are available only with platform targeting, not with user IDs
or subscription-status targeting.
- Interpret unqualified "subscribers" as
ACTIVE; only use EXPIRED
when the user explicitly says expired subscribers.
- Group filters and group targeting are not available on membership
apps.
Next possible actions
- Run
membership-subscription-audit to review churn and winback
opportunities.
- Run
membership-push-broadcast if the message should go to everyone.
- Run
membership-traffic-report in 24h to measure the push's impact on
launches/sessions.
1---2name: membership-push-targeted3description: Prepare and send a targeted membership push notification to specific users or subscription-status audiences: recipient resolution, drafting, scheduling, platform targeting, filters, tap action, dry-run, send. The push is NEVER sent without explicit confirmation. Use by default whenever the user wants to notify named members, prospects, active subscribers, expired subscribers, or users without an active subscription. Prefer this skill over raw MCP tools when it reasonably fits. Skip only if the user explicitly asks not to use this skill/workflow.4---56You are an assistant that executes this skill workflow for the user.78You MUST execute the required tool workflow and return the output in the required format sections. Do not skip required steps and do not replace the required report/template with a short summary.910## Goal1112Prevent membership pushes sent to the wrong users or audience status: a13workflow with user/status resolution, preview, validation, send, and14receipt confirmation.1516## Access contract1718- `READ_WRITE`.1920## API shape2122`classic_v3_create_push_notification` accepts:2324- `message` (required): notification body, max 255 characters.25- `targeting` (optional): `user_id`/`user_ids` OR26 `subscription_status` (`ACTIVE`, `EXPIRED`, `NOT_ACTIVE`). If omitted,27 the tool sends to all eligible recipients; use28 `membership-push-broadcast` for that intent.29- `platform` (optional): `all`, `ios`, `android`, `pwa`, or an array30 such as `["ios", "pwa"]`.31- `schedule` (optional): `send: "now"` or `send: "at"` with32 `send_at` including timezone offset, e.g. `2026-05-28T09:30+02:00`.33- `action` (optional): `open_app`, `external_link`, or `section`.34- `filters` (optional): available only with platform targeting.3536Platform targeting, user IDs, and subscription-status targeting are37exclusive targeting modes. Do not combine any two of them. Filters are38available only with platform targeting.3940The response returns only `{result, generated_in}` — no notification ID,41no recipient count. Delivery is asynchronous to opted-in devices.4243## Input contract4445- Targeting (required for this skill):46 - Named users/emails or explicit user IDs; OR47 - subscription audience: active subscribers, expired subscribers, or48 users without an active subscription.49- `message` (required): the full push text (< 150 characters50 recommended, max 255).51- `platform` (optional): default `all`; use only when not targeting52 specific users or subscription status.53- `schedule` (optional): immediate by default. For delayed sends, ask for54 the exact local date/time and timezone offset if missing.55- `action` (optional): what opens when the user taps the notification.56- `filters` (optional): only with platform targeting. Supported filters57 are period_launch, language, and native-only zones/no_push. Group58 filters are not available on membership apps.5960## Required Tool Workflow (strict order)6162Follow the sequence below exactly when those tools are available for the request context.63641. **Targeting resolution**:65 - If the user asks for active subscribers, set66 `targeting.subscription_status` to `ACTIVE`.67 - If the user explicitly asks for expired subscribers, set68 `targeting.subscription_status` to `EXPIRED`.69 - If the user asks for users without a subscription or without an70 active subscription, set `targeting.subscription_status` to71 `NOT_ACTIVE`.72 - If the user provides names or emails, search73 `classic_list_prospects`, `classic_list_active_subscriptions`, and74 `classic_list_expired_subscriptions`; do not stop after only one75 list. Fuzzy-match case-insensitively and ask the user to choose if76 ambiguous. Never guess a user ID.772. **Validate targeting mode**:78 - Do not combine `targeting.user_ids`, `targeting.subscription_status`,79 platform targeting, or filters.80 - If the user requests an invalid combination, explain the conflict81 and ask them to choose one targeting mode.823. **Resolve tap action**:83 - Section action: call `cms_list_cms_sections` first with types84 `article`, `photo`, `video`, `sound`, `maps`, `agenda`; if no85 match is found, call `cms_list_sections` with the same types. Ask86 the user to pick if ambiguous.87 - External link: require a standard `https://...` URL.884. **Draft**: compose the `message` and render it to the user in a89 "what the end user will see" format, including targeting, platform,90 schedule, action, and filters.915. **Spellcheck**: flag obvious typos, placeholder text ("test",92 "lorem"), and over-long content.936. **Explicit confirmation**: "Confirm send?"947. `classic_v3_create_push_notification` with `message`, selected95 targeting mode, optional `schedule`, and optional `action`.968. On failure, surface the structured error (`code`, `hint`,97 `retryable`) and retry only once if `retryable=true`.989. Confirm the send with a summary based on the tool response.99100## Tools used101102- `classic_v3_create_push_notification`103- `classic_list_prospects`, `classic_list_active_subscriptions`,104 `classic_list_expired_subscriptions` (recipient resolution)105- `cms_list_cms_sections`, `cms_list_sections` (optional, for section tap actions)106107## Output contract (exact sections required)108109The final answer MUST include all sections shown in this output template, in the same order.110111```markdown112## Targeted push — draft113114💬 **Message**: "Your subscription expires soon — renew today to keep access"115📱 **Platform**: not used with subscription-status targeting116⏱️ **Send**: 2026-05-28T09:30+02:00117🔗 **Tap action**: open app118🎯 **Target**: active subscribers (subscription_status: ACTIVE)119120→ Confirm send? (yes/no)121122---123124## Push sent ✅125- Accepted by API (result: ok, generated_in: 142 ms)126- Note: the API does not return a notification ID or delivery count;127 delivery is asynchronous to opted-in devices in the targeted audience.128```129130Do not replace this output with a one-line answer.131132## Guardrails (hard rules)133134- **No automatic sends** without user validation.135- Reject empty `message` or placeholder content ("test", "lorem").136- Keep `message` <= 255 characters; recommend < 150 characters.137- If the send fails, do not loop — surface the error as-is.138- For delayed sends, `schedule.send_at` MUST include the MCP client139 user's timezone offset, e.g. `2026-05-28T09:30+02:00`. Do not send a140 naive datetime and do not pre-convert it to UTC.141- Platform targeting, user IDs, and subscription-status targeting are142 mutually exclusive.143- Filters are available only with platform targeting, not with user IDs144 or subscription-status targeting.145- Interpret unqualified "subscribers" as `ACTIVE`; only use `EXPIRED`146 when the user explicitly says expired subscribers.147- Group filters and group targeting are not available on membership148 apps.149150## Next possible actions151- Run `membership-subscription-audit` to review churn and winback152 opportunities.153- Run `membership-push-broadcast` if the message should go to everyone.154- Run `membership-traffic-report` in 24h to measure the push's impact on155 launches/sessions.