{"id":46494,"plugin_id":"plugin_asdk_app_6a3699f00ba88191843d86aef525f03e","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-24T13:29:58.899Z","digest":"59269178530d803201b3108fc1b44299936bcc959fddea877ac6763ccdc8376a","against":null,"payload":{"description":"Finds customers eligible for a review request in a More Good Reviews project and schedules the requests after confirmation. Builds a ranked queue from a customer segment (default never asked), then sends via createAsk on approval. This SENDS outreach; it is not a report or a to-do list. Use when the user asks who to ask for reviews, wants a weekly ask list, or asks to send review requests to eligible customers.","included_files":[],"name":"review-pipeline","skill_md_contents":"---\nname: review-pipeline\ndescription: Finds customers eligible for a review request in a More Good Reviews project and schedules the requests after confirmation. Builds a ranked queue from a customer segment (default never asked), then sends via createAsk on approval. This SENDS outreach; it is not a report or a to-do list. Use when the user asks who to ask for reviews, wants a weekly ask list, or asks to send review requests to eligible customers.\n---\n\n# Review Pipeline\n\nTurn a customer segment into scheduled review requests for one More Good Reviews project: build the queue, confirm, send.\n\n**Prerequisite:** Requires a More Good Reviews Project API MCP server connected. This skill calls its tools and has no other data source. If no such server is connected, say so and stop.\n\n## Core principle: show the list, then ask before sending\n\n- Find eligible customers with `listCustomers`; do not over-fetch per-customer history.\n- The `not-asked` filter already excludes unsubscribed and archived customers from outreach eligibility — still confirm before sending.\n- Never call `createAsk` without explicit user approval of the final list.\n- Requests send through the **project's configured strategy and templates** (subject, copy, timing rules). This skill chooses *who* and *which channel*; it does not write custom message text.\n\n## Step 1: Select the project\n\nEach More Good Reviews Project API MCP connection is scoped to one project. A user may have several connected at once.\n\n- If exactly one is connected, use it without prompting.\n- If more than one is connected, name them and ask which to use.\n- Use one project's tools consistently for the whole run.\n\n## Step 2: Resolve the segment and window\n\nDefaults when the user gives nothing:\n\n| Input | Default |\n|-------|---------|\n| `filter` | `not-asked` |\n| `days` | `30` (signup lookback) |\n| `date_key` | `signed_up_at` |\n| `sort_key` / `sort_dir` | `signed_up_at` / `desc` (newest first) |\n| `max_results` | `50` |\n\n- Express the window as `date_from` / `date_to` in `YYYY-MM-DD`, inclusive.\n- State the resolved segment and window in the output headline.\n\n`listCustomers` filters: `archived`, `asked`, `has-notes`, `missed`, `not-asked`, `not-messaged`, `not-reviewed`, `reviewed`, `unsubscribed`. Do not use `has-charges`.\n\nOptional refinements:\n\n- `tag_slug` — limit to one tag.\n- Location: `listCustomers` has no location param; if the user needs one location, filter the returned rows by each customer's location, or ask them to narrow by tag.\n\n## Step 3: Fetch the queue\n\nCall `listCustomers` with the `filter`, `date_key`, `date_from`, `date_to`, `sort_key`, `sort_dir`, and `limit: max_results`.\n\n- Paginate only if the user wants more than `max_results`, or `pagination.total` exceeds the cap and they ask to see the rest.\n- Drop any row lacking contact for the chosen channel: needs `email` for email, `phone` for SMS.\n\n## Step 4: Present the queue\n\n```markdown\n# Review Pipeline — [Project] — [filter] — signed up [date_from] to [date_to]\nUp to [max_results], newest first. Requests will use this project's configured request templates.\n\n## Summary\n- Eligible: [n]   ·   Skipped (no contact): [n]   ·   Total in segment: [pagination.total]\n\n## Queue\n| # | Customer | Email / phone | Signed up | Last asked |\n|---|----------|---------------|-----------|------------|\n| 1 | Jane Doe | jane@example.com | 2026-06-15 | never |\n| 2 | ... | ... | ... | ... |\n\n## Next step\nConfirm which rows to schedule. Default channel: email when present, else SMS. Default reminders: 2.\n```\n\nWhen the queue is empty, say so and suggest widening the window or switching segment (e.g. `not-reviewed`).\n\n## Step 5: Schedule asks (write — approval required)\n\nOnly after the user confirms specific rows or approves the full list:\n\n1. Call `createAsk` per approved customer using their `email` or `phone`.\n2. Set `channels` to `[\"email\"]` or `[\"sms\"]` by available contact and user preference.\n3. Set `reminders_count` from user input or default `2`.\n4. Report success and failure per customer. Do not retry failures without asking.\n\nNever schedule customers the user removed. Never call `createAsk` before Step 5.\n\n## Configurable inputs\n\nAll optional; use defaults when the user gives nothing.\n\n- `filter` — segment. Default `not-asked`.\n- `days` — signup lookback. Default `30`.\n- `date_from` / `date_to` — explicit window; overrides `days`.\n- `date_key` — customer date column. Default `signed_up_at`.\n- `sort_key` / `sort_dir` — queue order. Default `signed_up_at` / `desc`.\n- `max_results` — queue cap. Default `50`.\n- `channel` — `email` or `sms`. Default: email when available, else SMS.\n- `reminders` — `reminders_count`. Default `2`.\n- `tag_slug` — optional tag filter.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}