{"id":"98523077-53b4-4a04-a606-95b36079bd36","entityType":"agent","slug":"clawhub-polnikale-sequenzy-email-marketing","name":"Sequenzy Email Marketing","canonicalUrl":"https://www.xpersona.co/agent/clawhub-polnikale-sequenzy-email-marketing","canonicalPath":"/agent/clawhub-polnikale-sequenzy-email-marketing","generatedAt":"2026-10-10T05:39:37.257Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:25:12.219Z","emptyReason":null},"description":"Agent guide for using Sequenzy safely","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.8K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17041008q4qqyghsw00t1mehh84gh6n:sequenzy-email-marketing","sourceUrl":"https://clawhub.ai/polnikale/sequenzy-email-marketing","homepage":"https://clawhub.ai/polnikale/skills/sequenzy-email-marketing","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/polnikale/sequenzy-email-marketing","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/polnikale/skills/sequenzy-email-marketing","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":65,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Sequenzy Email Marketing technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:25:12.219Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:25:12.219Z","emptyReason":null},"stars":null,"forks":null,"downloads":1775,"packageName":null,"latestVersion":"1.6.0","tractionLabel":"1.8K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:25:12.219Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T02:25:12.219Z","lastCrawledAt":"2026-10-10T02:25:12.219Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T02:25:12.219Z","lastVerifiedAt":null,"highlights":[{"version":"1.6.0","createdAt":"2026-08-04T21:06:05.547Z","changelog":"Full CLI/MCP parity sync: documents events, subscriber imports/notes/bulk tags, transactional template management, email-sends, suppressions, campaign audience/render/unschedule/resend-to-non-openers, recurring scheduling, forms, landing pages, sequence goals/webhooks/enrollments, template localizations, audience syncs, integrations, sender profiles, tracking, Shopify automation settings, SMS, sync rules, notification preferences, and api-keys management.","fileCount":6,"zipByteSize":41698},{"version":"1.4.0","createdAt":"2026-07-08T22:32:26.704Z","changelog":"Add the feedback workflow: agents report unsupported workflows, bugs, and other product feedback via 'sequenzy feedback' (CLI) or submit_feedback (MCP). Includes upstream hardened secret-handling guidance.","fileCount":6,"zipByteSize":27277},{"version":"1.3.0","createdAt":"2026-06-11T12:15:37.625Z","changelog":"Agent-surface parity: campaign lifecycle control (cancel/pause/resume/delete/duplicate), campaign A/B test management, list/tag/segment mutations, manual sequence enrollment, team invites, inbox triage and replies, and outbound webhook management across CLI and MCP.","fileCount":6,"zipByteSize":26040},{"version":"1.2.0","createdAt":"2026-06-11T08:43:54.313Z","changelog":"Add digital product delivery: products list/sync/attach-file/detach-file CLI commands, MCP product tools, and saas.purchase download.url delivery contract","fileCount":6,"zipByteSize":18347},{"version":"1.1.8","createdAt":"2026-06-02T22:32:35.068Z","changelog":"Remove stale unsupported guidance and document current subscriber list import behavior.","fileCount":6,"zipByteSize":16928},{"version":"1.1.7","createdAt":"2026-06-02T22:30:02.491Z","changelog":"Document subscriber list filters, bulk list import, and the 500-email list batch limit.","fileCount":6,"zipByteSize":16937},{"version":"1.1.6","createdAt":"2026-05-15T17:32:08.222Z","changelog":"Rename canonical skill slug to sequenzy-email-marketing.","fileCount":6,"zipByteSize":15918}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17041008q4qqyghsw00t1mehh84gh6n:sequenzy-email-marketing","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17041008q4qqyghsw00t1mehh84gh6n:sequenzy-email-marketing` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/polnikale/sequenzy-email-marketing before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-polnikale-sequenzy-email-marketing/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-polnikale-sequenzy-email-marketing/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-polnikale-sequenzy-email-marketing/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-polnikale-sequenzy-email-marketing/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-polnikale-sequenzy-email-marketing/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-polnikale-sequenzy-email-marketing/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T05:39:37.255Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-polnikale-sequenzy-email-marketing/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-polnikale-sequenzy-email-marketing/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-polnikale-sequenzy-email-marketing/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-polnikale-sequenzy-email-marketing/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T02:25:12.219Z","emptyReason":null},"readme":"Skill: Sequenzy Email Marketing\n\nOwner: polnikale\n\nSummary: Agent guide for using Sequenzy safely\n\nTags: latest:1.6.0\n\nVersion history:\n\nv1.6.0 | 2026-08-04T21:06:05.547Z | user\n\nFull CLI/MCP parity sync: documents events, subscriber imports/notes/bulk tags, transactional template management, email-sends, suppressions, campaign audience/render/unschedule/resend-to-non-openers, recurring scheduling, forms, landing pages, sequence goals/webhooks/enrollments, template localizations, audience syncs, integrations, sender profiles, tracking, Shopify automation settings, SMS, sync rules, notification preferences, and api-keys management.\n\nv1.4.0 | 2026-07-08T22:32:26.704Z | user\n\nAdd the feedback workflow: agents report unsupported workflows, bugs, and other product feedback via 'sequenzy feedback' (CLI) or submit_feedback (MCP). Includes upstream hardened secret-handling guidance.\n\nv1.3.0 | 2026-06-11T12:15:37.625Z | user\n\nAgent-surface parity: campaign lifecycle control (cancel/pause/resume/delete/duplicate), campaign A/B test management, list/tag/segment mutations, manual sequence enrollment, team invites, inbox triage and replies, and outbound webhook management across CLI and MCP.\n\nv1.2.0 | 2026-06-11T08:43:54.313Z | user\n\nAdd digital product delivery: products list/sync/attach-file/detach-file CLI commands, MCP product tools, and saas.purchase download.url delivery contract\n\nv1.1.8 | 2026-06-02T22:32:35.068Z | user\n\nRemove stale unsupported guidance and document current subscriber list import behavior.\n\nv1.1.7 | 2026-06-02T22:30:02.491Z | user\n\nDocument subscriber list filters, bulk list import, and the 500-email list batch limit.\n\nv1.1.6 | 2026-05-15T17:32:08.222Z | user\n\nRename canonical skill slug to sequenzy-email-marketing.\n\nArchive index:\n\nArchive v1.6.0: 6 files, 41698 bytes\n\nFiles: agents/openai.yaml (233b), references/command-reference.md (74817b), references/use-cases.md (28511b), skill-card.md (2660b), SKILL.md (13665b), _meta.json (143b)\n\nFile v1.6.0:SKILL.md\n\n---\nname: sequenzy-email-marketing\ndescription: Primary agent guide for operating Sequenzy as an email-marketing platform. Use when Codex needs to authenticate, inspect identity, manage subscribers, create or edit campaigns/sequences/templates, control the campaign lifecycle (cancel, pause, resume, delete, duplicate), run campaign A/B tests, mutate lists/tags/segments, enroll subscribers into sequences, invite team members, triage and reply to inbox conversations, manage outbound webhooks, generate draft email content, send transactional email, read delivery stats, or decide whether a requested Sequenzy email-marketing workflow is currently supported. Prefer this over the generic sequenzy skill when both seem relevant.\n---\n\n# Sequenzy Email Marketing\n\n## Overview\n\nUse this as the default skill for Sequenzy email-marketing/product operations: subscribers, lists, tags, segments, campaigns, sequences, templates, AI email generation, transactional sends, delivery stats, dashboard URLs, CLI/MCP behavior, and currently-supported workflow checks. Prefer the `sequenzy` CLI for supported workflows, treat `packages/mcp/src/tools/index.ts` as the MCP source of truth when the task goes through MCP tools, and explicitly call out when a requested workflow is not wired in the current implementation. If both `sequenzy` and `sequenzy-email-marketing` match, load this skill first.\n\n## Ground Rules\n\n1. Treat `packages/cli/src/index.tsx` as the source of truth for which commands are actually wired.\n2. Treat `packages/cli/src/commands/` and `packages/cli/src/api.ts` as the source of truth for CLI behavior, payload shape, and API routes.\n3. Treat `packages/mcp/src/tools/index.ts` as the source of truth for MCP tool names, arguments, and preflight validation.\n4. Do not promise support for commands or tools that only appear in docs or `--help` text without an attached implementation.\n5. Prefer `sequenzy login` for interactive auth and `SEQUENZY_API_KEY` for automation.\n6. Prefer inspection before mutation whenever the workflow allows it.\n\n## Supported Workflows\n\nRead [references/use-cases.md](references/use-cases.md) before executing anything non-trivial. The currently implemented CLI flows are:\n\n- login and logout\n- local auth/session check with `whoami`\n- account inspection with `account`\n- company inspection, creation, or brand/sender-identity updates with `companies list|get|create|update`\n- stats overview or stats by campaign, sequence, or transactional ID, with custom `--start`/`--end` ranges, `--email-type` and `--mailbox-provider` scoping, `--include-bots`, and campaign `clickedLinks` plus poll/NPS `polls` arrays\n- raw delivery/engagement event listing with `events --campaign|--sequence`, and per-delivery inspection with `email-sends list|get` plus bounce-suppression cleanup with `suppressions get|remove`\n- subscribers `list`, `add`, `update`, `get`, and `remove`, with `list` fetching every page by default and supporting tag, segment, and list filters; `add` and `update` set native profile names via `--first-name` / `--last-name` (MCP `add_subscriber` / `update_subscriber`: `firstName` / `lastName`), so never store names in custom attributes; both also handle native phone numbers and SMS consent\n- bulk subscriber imports with `subscribers import` / `import-status`, subscriber notes, custom event triggering with `subscribers event` (live or `--occurred-at` backfill), and bulk tag operations with `subscribers tags add|remove`\n- lists `list`, `create`, `update`, `delete`, `add-subscribers`, `remove-subscribers`, and `import` alias for bulk list population from emails, JSON, CSV, or newline files\n- tags `list`, `create`, `update`, and `delete`, with bare `sequenzy tags` still listing tag definitions for backwards compatibility\n- segments `list`, `create`, `update`, `delete`, and `count`, including `--match any`, nested filter roots, custom event filters, and saved-segment composition filters\n- templates `list`, `get`, `create`, `update`, and `delete`, with `list` supporting label filters and `create`/`update` accepting labels, raw HTML, or Sequenzy block JSON\n- campaigns `list`, `get`, `create`, `update` including label and reply-to updates, `schedule`, and `test`, with `list` supporting label filters, `create` accepting labels plus raw HTML, Sequenzy block JSON, or prompt-generated content, `update` accepting labels plus raw HTML or Sequenzy block JSON, and `schedule` returning a review preview link; `create` and `schedule` both accept the audience via `--segment` or `--target-lists-json`/`--target-lists-file`\n- campaign lifecycle control with `campaigns cancel` (stops scheduled, paused, waiting-approval, or sending campaigns immediately, no confirmation prompt), `campaigns unschedule` (returns a scheduled campaign or recurring series to draft), `campaigns pause` and `campaigns resume` for an active send (resume supports `--spread-over-hours`), `campaigns delete` (blocked while sending, scheduled, or paused - cancel first), and `campaigns duplicate` with `--mode campaign|ab_test|variant`\n- campaign audience inspection with `campaigns audience`, true-to-send HTML previews with `campaigns render` / `templates render` / `sequences render` (subscriber or ad-hoc personalization, locale, tracking, `--out`), recurring sends with `campaigns schedule --repeat weekly|monthly`, and post-send re-engagement with `campaigns resend-to-non-openers`\n- ab-tests `list`, `get`, `stats`, `restart`, `update-variant`, `create`, `add-variant`, `delete-variant`, and `delete`; create/add-variant/delete-variant/delete work on campaign A/B tests in draft status, variant A is the protected control, and `restart` reruns a finished sequence A/B test\n- MCP template and campaign tools support labels on list/create/update; MCP `update_campaign` also supports `replyTo` and `replyProfileId`, and MCP `schedule_campaign` schedules draft or already scheduled campaigns\n- MCP `search_subscribers` supports list filters through `list`, `listId`, or `listName`; MCP `add_subscribers_to_list` accepts up to 500 emails per call\n- sequences `list`, `get`, `create`, `update`, `enable`, `disable`, `delete`, `enroll`, and `cancel-enrollments`, including explicit discount action steps, cancellation by subscriber ID or event-property field values, and `update` branch insertion with tag, list, segment, event, clicked-link, and field conditions; event and clicked-link branch checks can use `activityScope` (`this_sequence`, `previous_email`, `ever`)\n- manual sequence enrollment with `sequences enroll` from emails, JSON, or files, optionally at a specific node with `--target-node-id`, reporting enrolled, skipped, and not-found subscribers\n- team `list`, `invite` with `--role admin|viewer` and owner-only `--billing-access`, and `cancel-invitation`\n- inbox `list` with status, search, unread, and pagination filters, `get`, `reply` including internal notes with `--note`, `close`, `reopen`, and `mark-read`\n- webhooks `list`, `create`, `update`, `delete`, `test`, `deliveries`, and `replay` for outbound webhook endpoints, with `create` returning a one-time signing secret that must be handled as sensitive\n- AI generation with `generate email`, `generate sequence`, `generate subjects`, and `generate sms`\n- dashboard URL generation with CLI `urls`, MCP `get_app_urls`, and `appUrls`/`url` fields on campaign, sequence, template, and company results\n- websites `list`, `add`, `check`, and `guide`\n- products `list`, `sync`, `upsert` (API-provider products keyed by your own ID, bulk up to 100), `delete`, `attach-file`, and `detach-file` for digital product delivery, with `attach-file --file` uploading local files via presigned URLs; attached files are exposed on `saas.purchase` events as `{{event.download.url}}` / `{{event.download.name}}` (MCP: `list_products`, `upsert_products`, `delete_product`, `attach_product_file`, `remove_product_file`, `sync_products`)\n- API key management with `api-keys create|list|revoke`, including permission presets and explicit scopes on create; new keys are handled as sensitive output\n- transactional email: one-off sends by template or raw HTML with `send`, plus saved-template management with `transactional list|get|create|update|delete` and preferences-iframe tokens via `transactional widgets preferences-token`\n- forms `list` and `update` (MCP additionally: `create_form`, `get_form_embed`) and full landing-page management with `landing-pages` including publish/unpublish, duplicate, custom domains, and DNS verification\n- sequence operations beyond CRUD: `render`, per-node `test` sends, `duplicate`, `archive`/`unarchive`, enrollment listing with CSV export, `pause-enrollments`/`resume-enrollments`, conversion `goals`, and inbound trigger `webhook get|configure|rotate`\n- template AI/manual localization with `templates localizations set|sync`\n- integrations: `catalog`, `connect` (API-key/webhook-secret providers; OAuth providers connect in the dashboard), `list`, `get`, `activity`, `sync`, `enable-sync`/`disable-sync`, Shopify `pixel`/`enable-pixel`, and `guide`\n- Meta Ads audience syncs with `audience-syncs list|ad-accounts|create|update|delete|sync`\n- deliverability and sending config: `sender-profiles list|update`, `tracking settings|update` (open/click tracking, strict bot filtering, attribution window, double opt-in, auto-UTM), and sequence/step-level sending windows\n- Shopify automation settings with `shopify settings get|update` (browse abandonment, cart abandonment, price drop)\n- SMS operations with `sms settings`, `sms send-test`, SMS sequence steps, and `generate sms`\n- integration event-to-tag sync rules with `sync-rules get|update`\n- personal notification preferences with `account notifications get|set`\n- product feedback with `feedback`, sending missing-capability reports, bug reports, and other product feedback straight to the Sequenzy team (MCP: `submit_feedback`)\n\n## Unsupported Or Placeholder Workflows\n\nTreat missing subcommands as unsupported even when the noun exists. The main remaining gaps: campaign immediate send (no \"send now\" command - schedule with a near-future `--at` timestamp instead), sending domain add/verify (MCP `add_sending_domain` / `verify_sending_domain` or dashboard only), form creation and embed snippets (MCP `create_form` / `get_form_embed` only), and image asset upload (MCP `upload_image_asset` only). Bulk list population is supported through `sequenzy lists add-subscribers` and its `sequenzy lists import` alias, not through `subscribers add`. Whenever the user wanted something unsupported, report the gap with `sequenzy feedback \"...\" --category missing_capability` (MCP: `submit_feedback`) so it reaches the Sequenzy team.\n\n## Execution Pattern\n\n1. Check auth first with `sequenzy whoami` or by verifying `SEQUENZY_API_KEY` is set.\n2. Pick the narrowest command that matches the use case.\n3. Validate IDs, recipient email, subject, template, or content input before issuing a mutation.\n4. Surface CLI limitations directly instead of inventing a workaround.\n5. If the workflow is unsupported in the CLI, say whether the next-best path is the Sequenzy dashboard or direct API use, and report the gap with `sequenzy feedback \"...\" --category missing_capability` (MCP: `submit_feedback`).\n6. When you create, inspect, or schedule a campaign, sequence, template, or company and the user may want to review/edit it, surface the dashboard URL from `url`, `previewUrl`, or `appUrls` in the tool/CLI output. If needed, generate it with `sequenzy urls` or MCP `get_app_urls`.\n7. Destructive commands (`delete`, `delete-variant`, `cancel-invitation`, and similar) prompt for confirmation. Pass `--yes` (or `-y`) to skip the prompt; `--yes` is required when stdin is not a TTY, which covers most agent and CI runs.\n8. Treat API keys, webhook signing secrets, and other one-time credentials as sensitive output. Do not paste raw secret values into chat, logs, tickets, or public transcripts. Capture them to a user-approved secure destination such as a password manager, secret store, encrypted file, or local `.env` file outside version control; otherwise redact the value and report only where it was saved plus a short fingerprint.\n9. Call out implementation caveats that matter operationally, such as `whoami` using cached local auth state, sequence creation supporting both `--goal` and explicit step modes, explicit discount steps requiring Stripe before activation, generated sequences being capped at 10 emails, `campaigns test` being a stubbed success path in the current backend, and conditional email content requiring block JSON rather than raw HTML.\n\n## Dashboard URLs\n\nUse `SEQUENZY_APP_URL` as the dashboard base when it is set; otherwise default to `https://sequenzy.com`.\n\nPrefer actual URLs returned by the CLI/MCP result:\n\n- sequence editor: `/dashboard/company/{companyId}/sequences/{sequenceId}`\n- campaign editor: `/dashboard/company/{companyId}/campaign/{campaignId}`\n- campaign preview/review: `/dashboard/company/{companyId}/campaign/{campaignId}?step=review`\n- template/email editor: `/dashboard/company/{companyId}/emails/{emailId}`\n- settings: `/dashboard/company/{companyId}/settings`\n- settings tab: `/dashboard/company/{companyId}/settings?tab={tab}`\n\nUseful settings tabs include `domain`, `tracking`, `localization`, `integrations`, `events`, `tags`, `goals`, `sync-rules`, `api-keys`, `widgets`, and `team`.\n\n## References\n\n- [references/command-reference.md](references/command-reference.md): exact command shapes, env vars, behavior, and caveats.\n- [references/use-cases.md](references/use-cases.md): decision trees and examples for the most common agent tasks.\n\nFile v1.6.0:_meta.json\n\n{\n  \"ownerId\": \"kn796v6hksmtm8ahgrwbcw6t8x83ctec\",\n  \"slug\": \"sequenzy-email-marketing\",\n  \"version\": \"1.6.0\",\n  \"publishedAt\": 1785877565547\n}\n\nFile v1.6.0:references/command-reference.md\n\n# Command Reference\n\n## Source Of Truth\n\n- Command registration: `packages/cli/src/index.tsx`\n- Auth storage and config: `packages/cli/src/config.ts`\n- HTTP requests: `packages/cli/src/api.ts`\n- Implemented handlers: `packages/cli/src/commands/`\n\nIf docs and code disagree, trust the code.\n\n## Authentication\n\n### Interactive login\n\n```bash\nsequenzy login\n```\n\n- starts device auth against `POST /api/device-auth/initiate`\n- polls `POST /api/device-auth/poll`\n- opens `${SEQUENZY_APP_URL}/setup/auth?code=...` in the browser\n- stores the API key in `Bun.secrets` when available, otherwise in local config\n\n### Non-interactive auth\n\nSet `SEQUENZY_API_KEY` in the environment. `packages/cli/src/config.ts` checks this before local storage, so it is the safest path for automation.\n\n### Identity and logout\n\n```bash\nsequenzy whoami\nsequenzy account\nsequenzy logout\n```\n\nBehavior:\n\n- `whoami` prints cached local config only\n- `account`: `GET /api/v1/account`\n- `logout` removes locally stored auth\n\nCaveat:\n\n- treat `whoami` as \"is this machine authenticated?\" rather than authoritative server-side account discovery\n\n## Environment Variables\n\n```bash\nSEQUENZY_API_KEY=...\nSEQUENZY_API_URL=https://api.sequenzy.com\nSEQUENZY_APP_URL=https://sequenzy.com\n```\n\nNotes:\n\n- `SEQUENZY_API_KEY` overrides local keychain/config state\n- the current CLI code defaults `SEQUENZY_APP_URL` to `https://sequenzy.com`\n- many company-scoped commands accept `--company`, which sends `x-company-id` for personal API keys\n\n## Dashboard URLs\n\n```bash\nsequenzy urls --company comp_123\nsequenzy urls --company comp_123 --sequence seq_123\nsequenzy urls --company comp_123 --campaign camp_123\nsequenzy urls --company comp_123 --template tmpl_123\nsequenzy urls --company comp_123 --landing-page lp_123\nsequenzy urls --company comp_123 --transactional tx_123\nsequenzy urls --company comp_123 --email-send send_123\nsequenzy urls --company comp_123 --settings-tab integrations\nsequenzy urls --company comp_123 --json\n```\n\nBehavior:\n\n- uses `SEQUENZY_APP_URL` as the base URL, defaulting to `https://sequenzy.com`\n- if `--company` is omitted, tries the current company from `GET /api/v1/account`\n- returns route templates, settings tab values, and concrete URLs when a company ID is known\n- also accepts `--email <id>` (email editor), `--domain <id>` (sending domain), and `--status` for campaign/sequence list URLs\n- campaign, sequence, template, company, and account outputs include `url` or `appUrls` fields when the company can be resolved\n\nCommon route patterns:\n\n- sequence editor: `/dashboard/company/{companyId}/sequences/{sequenceId}`\n- campaign editor: `/dashboard/company/{companyId}/campaign/{campaignId}`\n- template/email editor: `/dashboard/company/{companyId}/emails/{emailId}`\n- settings: `/dashboard/company/{companyId}/settings`\n- settings tab: `/dashboard/company/{companyId}/settings?tab={tab}`\n\n## Stats\n\n```bash\nsequenzy stats\nsequenzy stats --period 30d\nsequenzy stats --start \"2026-05-01T00:00:00Z\" --end \"2026-05-31T00:00:00Z\"\nsequenzy stats --campaign camp_123\nsequenzy stats --sequence seq_123\nsequenzy stats --transactional password-reset\nsequenzy stats --email-type transactional\nsequenzy stats --campaign camp_123 --mailbox-provider gmail\nsequenzy stats --campaign camp_123 --include-bots\n```\n\nBehavior:\n\n- no ID: `GET /api/v1/metrics?period=7d|30d|90d`, or a custom range with both `--start` and `--end`\n- `--campaign`: `GET /api/v1/metrics/campaigns/:id`\n- `--sequence`: `GET /api/v1/metrics/sequences/:id`\n- `--transactional <id-or-slug>` reports one saved transactional email; its stats are all-time by default, pass `--period` for a window\n- use exactly one of account-level stats, `--campaign`, `--sequence`, or `--transactional`; `--email-type` (e.g. `transactional`) applies only to account-level stats\n- `--mailbox-provider` (e.g. `gmail`, `microsoft`, `yahoo`) scopes account or campaign engagement metrics to one recipient mailbox provider; replies, conversions, and revenue cannot be segmented per provider and report 0 under this filter\n- bot/scanner opens and clicks are excluded by default; pass `--include-bots` to inspect raw engagement\n- sequence stats include a live active/waiting enrollment breakdown by current node plus per-step failures\n\nOutput includes:\n\n- `sent`\n- `delivered`\n- `opened`\n- `clicked`\n- `unsubscribed`\n- `openRate`\n- `clickRate`\n\nCampaign stats also include a `clickedLinks` array when the campaign has tracked link clicks: the top 20 destination URLs, most clicked first, each with `url`, `clicks`, and `percentage` (that link's share of every recorded link click). The CLI prints these as a Clicked Links section; use `--json` for the raw array. The MCP `get_campaign_stats` tool returns the same top-level array.\n\nCampaign stats also include a `polls` array when the campaign collected poll / NPS answers: one entry per poll block with `question`, `totalResponses`, per-answer counts and percentages, and an `nps` breakdown (`score`, `average`, promoters / passives / detractors) for NPS surveys.\n\n## Events\n\n```bash\nsequenzy events --campaign camp_123\nsequenzy events --sequence seq_123 --event-types delivery,open,click\nsequenzy events --campaign camp_123 --type open --period 24h --page 2 --limit 100\n```\n\nBehavior:\n\n- `--campaign`: `GET /api/v1/metrics/campaigns/:id/events`; `--sequence`: `GET /api/v1/metrics/sequences/:id/events`; use exactly one\n- defaults to delivery events; use `--type` for a single event type or `--event-types` for a comma-separated set (delivery, open, click, ...)\n- accepts `--period` (`1h`, `24h`, `7d`, `30d`, `90d`) or `--start`/`--end`, plus `--page` and `--limit` pagination\n- bot/scanner opens and clicks are excluded by default; pass `--include-bots` to inspect raw engagement\n- MCP parity: `list_campaign_events` and `list_sequence_events`\n\n## Subscribers\n\n### List\n\n```bash\nsequenzy subscribers list\nsequenzy subscribers list --tag vip\nsequenzy subscribers list --list \"Master List\" --json\nsequenzy subscribers list --segment seg_123\nsequenzy subscribers list --limit 100\nsequenzy subscribers list --tag vip --company comp_123 --json\n```\n\nBehavior:\n\n- sends `GET /api/v1/subscribers`\n- maps `--segment` to `segmentId`\n- maps `--tag` to `tags`\n- maps `--list` to `list`; the API resolves list ID first, then exact list name\n- maps `--limit` to `limit`\n- fetches every result page by default when `--limit` is omitted\n- supports `--company` and `--json`\n\n### Add\n\n```bash\nsequenzy subscribers add user@example.com\nsequenzy subscribers add user@example.com --first-name John --last-name Doe --tag premium --attr plan=pro\nsequenzy subscribers add user@example.com --phone \"+15550100\" --sms-consent\nsequenzy subscribers add user@example.com --list list_123 --skip-sequences\nsequenzy subscribers add user@example.com --created-at \"2024-03-01T00:00:00Z\"\nsequenzy subscribers add user@example.com --tag premium --tag beta --company comp_123 --json\n```\n\nBehavior:\n\n- sends `POST /api/v1/subscribers`\n- body shape is `{ email, firstName, lastName, tags, customAttributes }`\n- `--first-name` / `--last-name` set the native profile name fields; do not store names in `--attr`\n- `--phone` (with optional `--phone-country` for national numbers) writes the native phone field, not a custom attribute; pair it with `--sms-consent` to assert express written SMS consent\n- `--external-id <id>` stores a customer-owned subscriber ID that other subscriber commands can address with `--external-id`\n- `--list <ids...>` adds the subscriber to specific lists, `--no-lists` to none; the default is all lists\n- `--skip-sequences` suppresses sequence enrollment for this add\n- `--created-at` preserves a contact's real signup date (for migrations) so date-relative segments stay correct; it never moves an existing contact's date later and suppresses sequence enrollment because it describes the past\n- supports repeated `--tag` values\n- supports `--company` and `--json`\n\n### Update\n\n```bash\nsequenzy subscribers update user@example.com --status unsubscribed\nsequenzy subscribers update user@example.com --first-name Ana --last-name Silva\nsequenzy subscribers update user@example.com --phone \"+15550100\" --sms-consent\nsequenzy subscribers update user@example.com --tag churned --attr cancelReason=too_expensive\nsequenzy subscribers update user@example.com --attr plan=pro --merge\n```\n\nBehavior:\n\n- sends `PATCH /api/v1/subscribers/:email`\n- requires at least one of `--status`, `--first-name`, `--last-name`, `--phone`, `--sms-consent`/`--no-sms-consent`, `--tag`, or `--attr`\n- `--first-name` / `--last-name` set the native profile name fields; do not store names in `--attr`\n- changing `--phone` resets SMS consent unless `--sms-consent` is passed in the same command; `--no-sms-consent` revokes it\n- `--tag` replaces the subscriber's tags; `--attr` replaces custom attributes unless `--merge` is passed\n- `--external-id <id>` addresses the subscriber by customer-owned ID instead of email\n- supports `--company` and `--json`\n\n### Get\n\n```bash\nsequenzy subscribers get user@example.com\nsequenzy subscribers get user@example.com --company comp_123 --json\n```\n\nBehavior:\n\n- sends `GET /api/v1/subscribers/:email`\n- returns the full subscriber profile, including list memberships, sequence enrollments, email stats, and recent activity\n- `--external-id <id>` looks the subscriber up by customer-owned ID; `--include-bots` includes bot/scanner engagement in the stats\n- supports `--company` and `--json`\n\n### Remove\n\n```bash\nsequenzy subscribers remove user@example.com\nsequenzy subscribers remove user@example.com --hard\nsequenzy subscribers remove user@example.com --company comp_123 --json\n```\n\nBehavior:\n\n- without `--hard`, sends `PATCH /api/v1/subscribers/:email` with `{ status: \"unsubscribed\" }`\n- with `--hard`, sends `DELETE /api/v1/subscribers/:email`\n- `--external-id <id>` addresses the subscriber by customer-owned ID\n- supports `--company` and `--json`\n\n### Import\n\n```bash\nsequenzy subscribers import ./contacts.csv --list list_123\nsequenzy subscribers import --records-json '[{\"email\":\"a@example.com\",\"firstName\":\"Ana\",\"plan\":\"pro\"}]'\nsequenzy subscribers import ./contacts.csv --duplicate-strategy merge --opt-in-mode confirmed\nsequenzy subscribers import-status imp_123\n```\n\nBehavior:\n\n- `import` sends `POST /api/v1/subscribers/imports` and queues a full-record import from CSV, JSON file, or `--records-json`\n- CSV columns for email, names, external ID, phone, status, and tags are detected automatically; other columns become custom attributes\n- `--duplicate-strategy skip|merge|overwrite` (default `skip`) controls existing-contact behavior; `--list <ids...>` adds every imported subscriber to lists\n- `--enroll-sequences` enrolls matching subscribers (requires the `automations:trigger` scope); `--default-phone-country` and `--sms-consent` handle imported phone numbers\n- `--opt-in-mode default|confirmed|double_opt_in` sets email consent; use `confirmed` only when the contacts already gave verified consent\n- imports run asynchronously; poll the returned ID with `subscribers import-status` (`GET /api/v1/subscribers/imports/:importId`). A completed import can still contain failed rows - inspect failed counts and the `--json` reason maps\n- MCP parity: `create_subscriber_import` and `get_subscriber_import`\n\n### Notes\n\n```bash\nsequenzy subscribers notes list user@example.com\nsequenzy subscribers notes add user@example.com \"Asked for annual invoicing\"\nsequenzy subscribers notes delete note_123\n```\n\nBehavior:\n\n- `notes list`: `GET /api/v1/subscribers/:email/notes`; `notes add`: `POST /api/v1/subscribers/:email/notes`; `notes delete`: `DELETE /api/v1/subscribers/notes/:noteId`\n- `--external-id` addresses the subscriber by customer-owned ID\n- MCP parity: `list_subscriber_notes`, `add_subscriber_note`, and `delete_subscriber_note`\n\n### Trigger Event\n\n```bash\nsequenzy subscribers event user@example.com saas.purchase -p amount=99 -p plan=pro\nsequenzy subscribers event user@example.com saas.purchase --occurred-at \"2025-11-02T10:00:00Z\"\n```\n\nBehavior:\n\n- sends the named custom event for one subscriber; `-p/--property` sets event properties and `-a/--attr` updates custom attributes in the same call\n- without `--occurred-at` the event is live and runs the full chain: sync rules, sequence enrollment, waiting steps, and goal conversions\n- with an `--occurred-at` more than an hour in the past the event is recorded as history: stored with its real timestamp and counted by segments, but no sequences enroll and no webhooks fire; the contact's signup date also moves back to when the event occurred (never later). Use it for backfills, never to fake a live event\n- `--event-id` provides an idempotency key\n- MCP parity: `trigger_subscriber_event` and `trigger_subscriber_events` (bulk)\n\n### Bulk Tags\n\n```bash\nsequenzy subscribers tags add vip --email one@example.com two@example.com\nsequenzy subscribers tags add imported-2026 --emails-file ./batch.csv\nsequenzy subscribers tags remove trial --emails-json '[\"one@example.com\"]'\n```\n\nBehavior:\n\n- sends `POST /api/v1/subscribers/bulk/tags/add|remove`; targets come from repeated `--email`, `--emails-json`, `--emails-file`, `--external-id`, or `--subscriber-id`\n- only touches contacts that already exist; unknown identifiers are reported, never created\n- tag automations are skipped by default (what historical backfills want); pass `--trigger-automations` to fire `tag_added` sequences\n- requests are chunked at 500 targets each; totals in the output are combined across chunks\n- use `subscribers add`/`subscribers update` for single-contact tag changes\n- MCP parity: `bulk_add_subscriber_tags` and `bulk_remove_subscriber_tags`\n\n## Transactional Emails\n\n### Send\n\n```bash\nsequenzy send user@example.com --template welcome --var firstName=Ana\nsequenzy send user@example.com --subject \"Hello\" --html \"<h1>Hi</h1>\"\nsequenzy send user@example.com --subject \"Hello\" --html-file ./email.html\nsequenzy send user@example.com --subject \"Hello\" --html-file ./email.html --email-type marketing\n```\n\nBehavior:\n\n- sends `POST /api/v1/transactional/send`\n- body shape is `{ to, templateId, subject, html, variables }`\n- use either `--template` (a transactional API slug, cannot be combined with `--subject`) or `--html`/`--html-file` with a required `--subject`\n- `--email-type marketing` adds the standard unsubscribe footer and RFC 8058 one-click-unsubscribe headers; it supports one recipient only\n- `--reply-to` overrides the saved template or company Reply-To default\n- `--no-track-clicks` / `--no-track-opens` opt out of tracking for this send only; they cannot enable tracking the account has disabled\n- `--vars-json` accepts nested objects and arrays (including arrays for repeat blocks); `--var` overrides individual scalar keys\n- if the recipient matches a subscriber, saved first and last names fill omitted name variables; `--var` values override them\n- MCP parity: `send_email`\n\n### Saved Transactional Templates\n\n```bash\nsequenzy transactional list --status enabled\nsequenzy transactional get welcome\nsequenzy transactional create password-reset --prompt \"Write a password reset email\"\nsequenzy transactional create welcome --subject \"Welcome\" --html-file ./welcome.html\nsequenzy transactional update welcome --no-enabled\nsequenzy transactional delete welcome --yes\n```\n\nBehavior:\n\n- `list`: `GET /api/v1/transactional` with `--search`, `--status`, `--sort`, `--order`, and `--include-bots` filters\n- `get <slug>`: `GET /api/v1/transactional/:slug`\n- `create <name>`: `POST /api/v1/transactional`; provide exactly one of `--prompt`, HTML, or blocks; `--slug` sets the API slug used by `sequenzy send --template`\n- `update <slug>` is a partial update: only the fields you pass change; replacing the body takes HTML or blocks, not both; `--no-enabled` stops sends while keeping the template and its stats\n- `delete <slug>` frees the slug for reuse and stops further sends; past deliveries and stats are kept; requires the `transactional:delete` scope\n- `sequenzy transactional widgets preferences-token <email>` generates a subscription preferences iframe token\n- per-template stats: `sequenzy stats --transactional <id-or-slug>`\n- MCP parity: `list_transactional_emails`, `get_transactional_email`, `create_transactional_email`, `update_transactional_email`, `delete_transactional_email`, and `get_transactional_stats`\n\n## Email Sends\n\n```bash\nsequenzy email-sends list --recipient user@example.com --days 7\nsequenzy email-sends list --status bounced --email-type transactional\nsequenzy email-sends list --all --csv email-sends.csv\nsequenzy email-sends get send_123\nsequenzy email-sends get send_123 --html-only\n```\n\nBehavior:\n\n- `list`: `GET /api/v1/email-sends`; matches the dashboard's 14-day delivery history with `--search`, `--subject`, `--recipient`, `--status`, `--email-type`, `--bounce-type`, `--campaign`, `--transactional`, `--sequence`, `--days`, paging, and sort filters\n- the `opened` status includes clicked deliveries, matching the dashboard\n- `--all --csv <path>` exports every matching delivery\n- `get <emailSendId>`: `GET /api/v1/email-sends/:id`; returns timestamps and the complete event timeline; `--html` prints the stored HTML body when still available, `--html-only` prints just the HTML\n- email send rows are short-lived; if a row was cleaned up, `get` falls back to retained ClickHouse events\n- MCP parity: `list_email_sends` and `get_email_send`\n\n## Suppressions\n\n```bash\nsequenzy suppressions get user@example.com\nsequenzy suppressions remove user@example.com --yes\n```\n\nBehavior:\n\n- `get`: `GET /api/v1/suppressions/:email`, optionally scoped with `--region`; `remove`: clears the suppression\n- lookup is exact-address only because the SES account-level list is shared across companies\n- removal clears stale bounce entries only; complaint and unsubscribe protections are preserved\n- MCP parity: `get_recipient_suppression` and `remove_recipient_suppression`\n\n## Companies, Lists, Tags, And Segments\n\n### Companies\n\n```bash\nsequenzy companies list\nsequenzy companies get comp_123\nsequenzy companies create example.com --name Example\nsequenzy companies update comp_123 --primary-color '#0ea5e9' --tone-voice \"clear, direct, warm\"\nsequenzy companies update comp_123 --company-context-file ./product.md\nsequenzy companies update comp_123 --sender-profile-id sender_abc --from-name \"Example News\"\nsequenzy companies update comp_123 --enable-reply-tracking --reply-tracking-domain-mode sequenzy\n```\n\nBehavior:\n\n- `companies list`: `GET /api/v1/companies`\n- `companies get`: `GET /api/v1/companies/:id`\n- `companies create`: `POST /api/v1/companies`; takes a domain plus optional `--name` and queues website processing automatically\n- `companies update`: `PATCH /api/v1/companies/:id` covering brand fields (`--description`, `--logo-url`, `--primary-color`, `--brand-colors-json`, `--font-family`, `--email-theme-json`, `--email-direction`), AI context (`--tone-voice`, `--company-context`, `--value-props-json`, `--testimonials-json`, `--pricing-json`, `--email-length-preference`), compliance (`--privacy-policy-url`, `--terms-url`, `--address`, `--language`, `--social-links-json`), and sender identity (`--sender-profile-id`, `--from-email`, `--from-name`, `--reply-profile-id`, `--reply-to`, `--reply-to-name`, `--enable/disable-reply-tracking`, `--reply-tracking-domain-mode`, `--enable/disable-reply-forwarding`)\n- most JSON-valued flags have `-file` variants to avoid shell escaping\n- MCP parity: `get_company`, `create_company`, and `update_company`\n\n### Lists\n\n```bash\nsequenzy lists list\nsequenzy lists create Newsletter --description \"Public newsletter list\"\nsequenzy lists create VIP --private --company comp_123\nsequenzy lists update list_123 --name \"Weekly Newsletter\" --private\nsequenzy lists update list_123 --no-private\nsequenzy lists add-subscribers list_123 --email one@example.com two@example.com\nsequenzy lists add-subscribers list_123 --emails-json '[\"one@example.com\",\"two@example.com\"]'\nsequenzy lists add-subscribers list_123 --emails-file ./batch-001.csv\nsequenzy lists import list_123 --emails-file ./batch-001.csv\nsequenzy lists remove-subscribers list_123 --email one@example.com two@example.com\nsequenzy lists remove-subscribers list_123 --emails-file ./churned.csv\nsequenzy lists delete list_123 --yes\n```\n\nBehavior:\n\n- `lists list`: `GET /api/v1/lists`\n- `lists create`: `POST /api/v1/lists`\n- create body shape is `{ name, description, isPrivate }`\n- `lists update`: `PATCH /api/v1/lists/:listId` with at least one of `--name`, `--description`, `--private`, or `--no-private`\n- `lists delete`: `DELETE /api/v1/lists/:listId`; removes the list and all of its memberships, reports `removedMemberships`, and keeps the subscribers themselves\n- `lists add-subscribers` and `lists import`: `POST /api/v1/lists/:listId/subscribers`\n- `lists remove-subscribers`: `POST /api/v1/lists/:listId/subscribers/remove`\n- add-subscribers body shape is `{ emails, duplicateStrategy, enrollInSequences, optInMode }`\n- remove-subscribers takes the same email input formats as add-subscribers, only removes list memberships, and reports `removed` plus `notFound` emails\n- the CLI splits large files into API-safe batches of up to 500 emails for both add and remove\n- files may be newline-separated, CSV with an email column, a JSON email array, or a JSON object with `emails` or `subscribers`\n- CSV headers named `email`, `e-mail`, `email address`, or `mail` are detected; otherwise the first column is used\n- `lists delete` prompts for confirmation; pass `--yes` to skip\n- MCP parity: `update_list`, `delete_list`, and `remove_subscribers_from_list` (max 500 emails per call)\n\n### Tags\n\n```bash\nsequenzy tags\nsequenzy tags list --company comp_123 --json\nsequenzy tags create vip --color purple\nsequenzy tags update tag_123 --color red\nsequenzy tags delete tag_123 --yes\n```\n\nBehavior:\n\n- `tags list`: `GET /api/v1/tags`; bare `sequenzy tags` without a subcommand still lists tag definitions for backwards compatibility\n- `tags create`: `POST /api/v1/tags` with `{ name, color? }`\n- `tags update`: `PATCH /api/v1/tags/:tagId` with `{ color }` (`--color` is required)\n- `tags delete`: `DELETE /api/v1/tags/:tagId`\n- tag names are normalized to lowercase with dashes, so `VIP Customer` becomes `vip-customer`\n- the color defaults to `gray`; valid colors are `gray`, `red`, `orange`, `amber`, `yellow`, `lime`, `green`, `emerald`, `teal`, `cyan`, `sky`, `blue`, `indigo`, `violet`, `purple`, `fuchsia`, `pink`, and `rose`\n- system tags cannot be updated or deleted\n- tags still referenced by sequences cannot be deleted until those sequences stop using them\n- deleting a tag removes it from every subscriber; the delete prompt warns about this, and `--yes` skips it\n- MCP parity: `list_tags`, `create_tag`, `update_tag`, and `delete_tag`\n\n### Segments\n\n```bash\nsequenzy segments list\nsequenzy segments count seg_123\nsequenzy segments create --name \"Bought Pro\" --stripe-product prod_pro\nsequenzy segments create --name \"3+ Pro Payments\" --stripe-product prod_pro --purchase-operator at-least --payments 3\nsequenzy segments create --name \"VIP or Churn Risk\" --match any --filter-json '[{\"field\":\"tag\",\"operator\":\"contains\",\"value\":\"vip\"},{\"field\":\"emailOpened\",\"operator\":\"is_not\",\"value\":\"30d\"}]'\nsequenzy segments create --name \"Active non-paying\" --filter-json '{\"kind\":\"group\",\"id\":\"root\",\"joinOperator\":\"and\",\"children\":[{\"kind\":\"filter\",\"id\":\"f1\",\"field\":\"attribute\",\"operator\":\"gte\",\"value\":\"last_login_days_ago:0\"},{\"kind\":\"group\",\"id\":\"g1\",\"joinOperator\":\"or\",\"children\":[{\"kind\":\"filter\",\"id\":\"f2\",\"field\":\"attribute\",\"operator\":\"is_empty\",\"value\":\"plan_end\"},{\"kind\":\"filter\",\"id\":\"f3\",\"field\":\"attribute\",\"operator\":\"lt\",\"value\":\"plan_end:2026-04-21\"}]}]}'\nsequenzy segments update seg_123 --name \"Churn Risk\"\nsequenzy segments update seg_123 --filters-json '[{\"field\":\"tag\",\"operator\":\"contains\",\"value\":\"vip\"}]'\nsequenzy segments update seg_123 --join-operator or\nsequenzy segments delete seg_123 --yes\n```\n\nBehavior:\n\n- `segments list`: `GET /api/v1/segments`\n- `segments count`: `GET /api/v1/segments/:id/count`\n- `segments create`: `POST /api/v1/segments`\n- `segments update`: `PATCH /api/v1/segments/:segmentId` with at least one of `--name`, `--filters-json`, `--filters-file`, or `--join-operator and|or`\n- `segments delete`: `DELETE /api/v1/segments/:segmentId`; prompts for confirmation, `--yes` skips\n- update filters replace the existing filter set; `--filters-json`/`--filters-file` accept the same array or `root` object shapes as create, and missing filter IDs are filled in by the CLI\n- `--filter-json` accepts either the legacy raw segment filter array or a nested filter `root` object\n- `--match all|any` controls whether top-level filters are combined with `and` or `or`\n- MCP/API use `filterJoinOperator: \"and\" | \"or\"` for the same behavior\n- nested segment logic uses `{ \"kind\": \"group\", \"joinOperator\": \"and\" | \"or\", \"children\": [...] }`\n- custom event filters use `field: \"event\"` with values like `saas.purchase:30d`, `saas.purchase:all`, or `saas.purchase:5:30d`\n- saved segment composition uses `field: \"segment\"` with `operator: \"is\" | \"is_not\"` and the referenced segment id as `value`\n- Stripe product filters use `field: \"stripeProduct\"` and product IDs, not product names\n- commerce purchase filters use `--commerce-product <id>` or `--commerce-collection <key>` with `--purchase-operator` and `--orders <number>` for order-count thresholds; `--payments` is the Stripe equivalent\n- threshold operators encode the count as `productId:count`, for example `prod_pro:3`\n- MCP parity: `update_segment` (reuses the create filter schemas) and `delete_segment`\n\n## Products And Digital Delivery\n\n```bash\nsequenzy products list\nsequenzy products list --provider stripe --search guide\nsequenzy products list --all\nsequenzy products sync\nsequenzy products upsert my-course --title \"Video Course\" --price-cents 4900 --currency usd --file ./course.zip\nsequenzy products upsert --products-file ./catalog.json\nsequenzy products delete my-course\nsequenzy products attach-file <product-id> --file ./guide.pdf\nsequenzy products attach-file <product-id> --url https://example.com/template.zip --name template.zip\nsequenzy products detach-file <product-id>\n```\n\nBehavior:\n\n- `products list`: `GET /api/v1/products`, optionally with `?provider=stripe|shopify|woocommerce|manual&search=...`; returns one page by default (100-per-request cap), pass `--all` to page through larger catalogs\n- `products sync`: `POST /api/v1/products/sync`; queues a catalog sync (`--integration` selects one when several are connected) and returns 404 without an active integration\n- `products upsert [productId]`: creates or updates API-provider products keyed by your own `productId`; supports `--title`, `--description`, `--price-cents`, `--currency`, `--image-url`, `--product-url`, `--in-stock`/`--out-of-stock`, `--provider-created-at`, and bulk `--products-json`/`--products-file` for up to 100 products; combine `--file` or `--url` with a single-product upsert to attach the deliverable in the same command\n- `products delete <productId>`: `DELETE /api/v1/products/:id`\n- `products attach-file --file`: `POST /api/v1/products/delivery/upload-url` for a presigned URL, PUTs the file bytes there, then `PUT /api/v1/products/:id/delivery` with `source: \"upload\"`\n- `products attach-file --url`: `PUT /api/v1/products/:id/delivery` with `source: \"url\"`\n- `products detach-file`: `DELETE /api/v1/products/:id/delivery`\n- MCP equivalents: `list_products`, `upsert_products`, `delete_product`, `attach_product_file` (URL attach only), `remove_product_file`, `sync_products`\n\nCaveats:\n\n- the `<product-id>` argument is the internal Sequenzy product ID from `products list`, not the Stripe `prod_...` ID; the Stripe ID is shown as the provider product ID in list output\n- uploads accept PDF, ePub, ZIP, images, audio, video, and text files up to 100MB; HTML, SVG, and executables are rejected\n- after attaching, purchases of the product enrich the `saas.purchase` event with `download.url` and `download.name`, so purchase sequences can deliver the file with `{{event.download.url}}` and `{{event.download.name}}`\n- to start a purchase sequence only for one product, the trigger needs a `productIds equals <stripe product id>` property filter on the `saas.purchase` event; this is configured in the dashboard sequence editor (\"Only for product\" picker), not through current CLI/MCP flags\n- products archived in Stripe stay listed with an archived flag, and attached files survive catalog re-syncs\n- the upload endpoint returns 503 when file storage is not configured on the server; fall back to `--url` in that case\n\n## Audience Syncs (Meta Ads)\n\n```bash\nsequenzy audience-syncs list\nsequenzy audience-syncs ad-accounts\nsequenzy audience-syncs create --template recent-buyers --ad-account act_123 --name \"Sequenzy - Recent buyers\"\nsequenzy audience-syncs create --segment seg_123 --ad-account act_123 --name \"Sequenzy - VIPs\" --frequency hourly\nsequenzy audience-syncs update sync_123 --frequency weekly --active false\nsequenzy audience-syncs sync sync_123\nsequenzy audience-syncs delete sync_123\n```\n\nBehavior:\n\n- syncs a segment to a Meta custom audience; requires the Meta Ads integration connected in the dashboard (Settings -> Integrations)\n- `create` requires `--ad-account` (from `audience-syncs ad-accounts`) and `--name`, plus either `--segment <id>` or `--template` (`zero-ltv`, `no-purchase-1y`, `recent-buyers`, `high-spenders-ecom`, `non-buyers`, `engaged` - the segment is created automatically on first use)\n- `--frequency hourly|daily|weekly` defaults to daily; `sync` triggers an immediate run\n- audiences are add-only: subscribers who leave the segment stay in the Meta audience\n- MCP parity: `list_audience_syncs`, `list_ad_accounts`, `create_audience_sync`, `update_audience_sync`, `delete_audience_sync`, and `sync_audience_now`\n\n## Templates\n\n```bash\nsequenzy templates list\nsequenzy templates list --label edm\nsequenzy templates get tmpl_123\nsequenzy templates create welcome --subject \"Welcome\" --label edm --html-file ./welcome.html\nsequenzy templates create welcome --subject \"Welcome\" --blocks-file ./welcome-blocks.json\nsequenzy templates update tmpl_123 --subject \"Updated\" --label edm --html-file ./welcome-v2.html\nsequenzy templates update tmpl_123 --blocks-file ./welcome-v2-blocks.json\nsequenzy templates render tmpl_123 --out preview.html\nsequenzy templates localizations set tmpl_123 es --blocks-file ./welcome-es.json\nsequenzy templates localizations sync tmpl_123 --locale es fr\nsequenzy templates delete tmpl_123\n```\n\nBehavior:\n\n- `templates list`: `GET /api/v1/templates`, optionally with `?label=...`\n- `templates get`: `GET /api/v1/templates/:id`\n- `templates create`: `POST /api/v1/templates`\n- `templates update`: `PUT /api/v1/templates/:id`\n- `templates render`: `GET /api/v1/templates/:id/render`; same personalization and output flags as `campaigns render` (see Campaigns)\n- `templates localizations set <id> <locale>` stores caller-supplied localized content immediately; the locale must be enabled in the company's localization settings and cannot be the primary locale; provide exactly one HTML or blocks content source\n- `templates localizations sync <id>` queues AI translation for selected `--locale` values, or every enabled non-primary locale when omitted\n- `templates delete`: `DELETE /api/v1/templates/:id`\n- MCP parity: `set_template_localization` and `sync_template_localizations`\n\nCaveats:\n\n- list accepts `--label <labels...>` to filter by template label name\n- create requires `name`, `subject`, and either `html` or `blocks`; it can also assign labels with `--label <labels...>`\n- update accepts `name`, `subject`, `html`, `blocks`, and replacement labels with `--label <labels...>`\n- `--blocks-json` and `--blocks-file` pass Sequenzy block arrays through directly\n- conditional email content is only available through block JSON, using a block-level `condition` object\n- raw HTML is still stored as a single text block by the current API path\n- deletion can fail if the template is still referenced by a campaign or sequence\n\n## Campaigns\n\n```bash\nsequenzy campaigns list\nsequenzy campaigns list --status draft --label edm --company comp_123\nsequenzy campaigns get camp_123\nsequenzy campaigns create \"April Launch\" --prompt \"Announce our new dashboard\"\nsequenzy campaigns create \"April Launch\" --subject \"We shipped\" --label edm --html-file ./campaign.html\nsequenzy campaigns create \"April Launch\" --subject \"We shipped\" --blocks-file ./campaign-blocks.json\nsequenzy campaigns create \"Partner Update\" --subject \"We shipped\" --html-file ./campaign.html --segment seg_123\nsequenzy campaigns create \"Partner Update\" --subject \"We shipped\" --html-file ./campaign.html --target-lists-json '{\"type\":\"lists\",\"listIds\":[\"list_123\"]}'\nsequenzy campaigns update camp_123 --subject \"Updated subject\" --label edm\nsequenzy campaigns update camp_123 --blocks-file ./campaign-v2-blocks.json\nsequenzy campaigns update camp_123 --reply-to support@example.com\nsequenzy campaigns update camp_123 --reply-profile reply_123\nsequenzy campaigns audience camp_123\nsequenzy campaigns render camp_123 --out preview.html\nsequenzy campaigns render camp_123 --subscriber sub_123 --out -\nsequenzy campaigns schedule camp_123 --at \"2026-06-01T14:00:00Z\"\nsequenzy campaigns schedule camp_123 --at \"2026-06-01T14:00:00Z\" --segment seg_123\nsequenzy campaigns schedule camp_123 --at \"2026-06-01T14:00:00Z\" --target-lists-json '{\"type\":\"all\"}'\nsequenzy campaigns schedule camp_123 --at \"2026-06-01T14:00:00Z\" --repeat monthly\nsequenzy campaigns test camp_123 --to you@example.com\nsequenzy campaigns cancel camp_123\nsequenzy campaigns unschedule camp_123\nsequenzy campaigns pause camp_123\nsequenzy campaigns resume camp_123 --spread-over-hours 6\nsequenzy campaigns delete camp_123 --yes\nsequenzy campaigns duplicate camp_123 --mode ab_test\nsequenzy campaigns duplicate camp_123 --mode variant --variant-id var_b\nsequenzy campaigns resend-to-non-openers camp_123\n```\n\nBehavior:\n\n- `campaigns list`: `GET /api/v1/campaigns`, optionally with `?status=...` and `?label=...`; results are paginated (default page size 50, `--limit` capped at 100), page with `--offset`\n- `campaigns get`: `GET /api/v1/campaigns/:id`\n- `campaigns audience`: `GET /api/v1/campaigns/:id/audience`; resolves list and segment names, recomputes the recipient count at read time, and warns when targeting is unset (scheduling then sends to every active subscriber)\n- `campaigns render`: `GET /api/v1/campaigns/:id/render`; renders the email exactly as it would be sent. Personalize with `--subscriber <id>` or `--email <addr>` (plus `--first-name`, `--attr`, `--attrs-json`, `--var`, `--vars-json`), force a locale with `--locale`, apply auto-UTM with `--tracking`, pick an A/B variant with `--variant`, and write with `--out <file|->`. Unresolved merge tags are listed in the summary; per-send click redirects and the open pixel are added at send time, so they never appear in a render\n- `campaigns create`: `POST /api/v1/campaigns`\n- `campaigns update`: `PUT /api/v1/campaigns/:id`\n- `campaigns schedule`: `POST /api/v1/campaigns/:id/schedule`\n- `campaigns test`: `POST /api/v1/campaigns/:id/test`\n- `campaigns cancel`: `POST /api/v1/campaigns/:id/cancel`\n- `campaigns unschedule`: returns a scheduled campaign (and any recurrence) to an editable draft; only scheduled campaigns can be unscheduled\n- `campaigns pause`: `POST /api/v1/campaigns/:id/pause`\n- `campaigns resume`: `POST /api/v1/campaigns/:id/resume`\n- `campaigns delete`: `DELETE /api/v1/campaigns/:id`\n- `campaigns duplicate`: `POST /api/v1/campaigns/:id/duplicate`\n- `campaigns resend-to-non-openers`: `POST /api/v1/campaigns/:id/resend-to-non-openers`; available 6 hours after a sent campaign finishes, creates a draft targeting the same audience plus a \"didn't open this campaign\" rule, and estimates the non-opener count - review the draft, then schedule it\n- dashboard-aware responses include `url`, campaign review `previewUrl`, and `appUrls` when the company can be resolved\n\nCaveats:\n\n- list accepts `--status` and `--label <labels...>` filters\n- create supports `name`, optional `subject` when `--prompt` is used (the generated subject is used unless `--subject` is also provided), `html`, `blocks`, `--prompt`, `--style`, `--tone`, and labels with `--label <labels...>`\n- create and update also take `--preview-text` / `--preheader-text` for the inbox preview line and `--tracking-code` for a campaign UTM code\n- create `--status sent` with `--sent-at` archives an already-sent campaign (for migrations); it does not send email or create per-recipient delivery history\n- create can save the audience on the draft with `--segment <id>`, `--target-lists-json`, or `--target-lists-file`; `--segment` and the target list flags are mutually exclusive, and omitting all of them leaves targeting unset\n- `campaigns create` and `campaigns get` print the saved audience on the `Audience` line and return it as `targetLists` with `--json`\n- target list examples: `{\"type\":\"all\"}`, `{\"type\":\"lists\",\"listIds\":[\"list_123\"]}`, `{\"type\":\"segment\",\"segmentId\":\"seg_123\"}`\n- update supports `name`, `subject`, `html`, `blocks`, replacement labels with `--label <labels...>`, `--reply-to`, and `--reply-profile`\n- update can replace the saved audience with `--segment` or `--target-lists-json`/`--target-lists-file`, or drop it with `--clear-target-lists` to choose at schedule time\n- update takes `--campaign-data-json/-file` and `--computed-lists-json/-file` to upload personalization data for repeat blocks\n- schedule requires `--at <datetime>` with a future ISO timestamp and a verified sending domain\n- schedule can pass targeting with `--segment`, `--target-lists-json`, or `--target-lists-file`; omit them to reuse saved targeting or default to all active subscribers\n- schedule `--repeat weekly|monthly` makes the campaign a recurring template: each run is duplicated and sent automatically, and audience membership is re-evaluated at every run; use `campaigns unschedule` to stop the series, or re-schedule without `--repeat` for a one-shot send\n- `--spread-over-hours` accepts integers from 1 to 72 and takes precedence over send-time optimization (`--send-time-optimization`)\n- `--prompt` generates draft campaign content through `POST /api/v1/generate/email`; do not combine it with HTML or block flags\n- `--blocks-json` and `--blocks-file` pass Sequenzy block arrays through directly\n- conditional email content is only available through block JSON, using block-level `condition` rules\n- `--reply-to` resolves an existing reply profile by email and `--reply-profile` sets it directly by ID\n- `--reply-to` and `--reply-profile` are mutually exclusive\n- `campaigns get` now includes saved reply-to details when the campaign has a reply profile\n- only draft campaigns can be updated through this API path\n- there is no CLI command for immediate send; schedule with a near-future `--at` timestamp instead\n- `cancel` works from scheduled, sending, paused, waiting_approval, and rejected statuses; it shows no confirmation prompt so a bad send can be stopped fast\n- `pause` only works on a campaign in sending status; `resume` only works on a paused campaign\n- `resume --spread-over-hours` accepts integers from 1 to 72 to spread the remaining delivery\n- `delete` is blocked while the campaign is sending, scheduled, or paused; cancel it first\n- `duplicate --mode campaign` copies the campaign email, `--mode ab_test` also copies the A/B test with all variants, and `--mode variant` (requires `--variant-id`) copies one variant's content as a plain campaign; the copy is always a new draft\n- in the current backend checkout, `campaigns test` returns a success message path rather than a confirmed email send\n\nMCP parity:\n\n- `list_templates` and `list_campaigns` accept `label`\n- `create_template`, `update_template`, `create_campaign`, and `update_campaign` accept `labels`\n- `create_campaign` accepts `targetLists` (or the `segmentId` shorthand, mutually exclusive) to save the audience on the draft; `get_campaign` returns it as `targetLists`, `null` when targeting is still unset\n- `update_campaign` accepts `name`, `subject`, `html`, `blocks`, `labels`, `replyTo`, and `replyProfileId`\n- `schedule_campaign` accepts `campaignId`, `scheduledAt`, optional `targetLists`, `sendTimeOptimization`, and `spreadOverHours`\n- `cancel_campaign`, `unschedule_campaign`, `pause_campaign`, `resume_campaign` (optional `spreadOverHours`), `delete_campaign`, and `duplicate_campaign` (optional `mode` and `variantId`) mirror the lifecycle commands\n- `get_campaign_audience`, `render_email`, and `resend_campaign_to_non_openers` mirror `audience`, `render`, and `resend-to-non-openers`\n- `replyTo` and `replyProfileId` are mutually exclusive\n- MCP rejects calls that omit all update fields before hitting the API\n- MCP rejects unsupported extra update fields before hitting the API\n\n## Forms\n\n```bash\nsequenzy forms list --json\nsequenzy forms update form_123 --headline \"Join the newsletter\" --button-text \"Subscribe\"\nsequenzy forms update form_123 --list list_123 --tag tag_456 --duplicate-strategy merge\nsequenzy forms update form_123 --blocks-file ./form-blocks.json\n```\n\nBehavior:\n\n- `forms list`: `GET /api/v1/forms`; `forms update`: `PATCH /api/v1/forms/:id`\n- updates are partial: only the options you pass change; other flags cover `--name`, `--success-message`, `--redirect-url`, `--theme-json/-file`, and `--clear-tags` to empty the tag targeting\n- run `forms list --json` before replacing blocks and send the complete current block array; the form must retain exactly one email field and one submit button\n- MCP parity: `list_forms` and `update_form`; MCP additionally has `create_form` and `get_form_embed` (embed snippet), which have no CLI command yet\n\n## Landing Pages\n\n```bash\nsequenzy landing-pages list\nsequenzy landing-pages get lp_123\nsequenzy landing-pages create \"Spring promo\" --template default\nsequenzy landing-pages create \"Spring promo\" --content-file ./page.json\nsequenzy landing-pages update lp_123 --name \"Spring promo v2\" --content-file ./page-v2.json\nsequenzy landing-pages publish lp_123\nsequenzy landing-pages unpublish lp_123\nsequenzy landing-pages duplicate lp_123 --name \"Autumn promo\"\nsequenzy landing-pages delete lp_123\nsequenzy landing-pages connect-domain pages.example.com\nsequenzy landing-pages update-domain-settings --domain pages.example.com --verify\n```\n\nBehavior:\n\n- CRUD maps to `GET/POST/PATCH/DELETE /api/v1/landing-pages[/:id]`, plus `/publish`, `/unpublish`, and `/duplicate` actions and `/api/v1/landing-pages/domain` for custom domains\n- pages are created as drafts; publish only after reviewing. When `--content-json/-file` is omitted, a valid default page is generated from `--template`\n- a duplicate is always a draft with its own slug, views, and conversions; without `--name` it is called \"<original name> (copy)\"\n- custom domains require a CNAME record pointing to `pages.sequenzydns.com`\n- MCP parity: `list_landing_pages`, `get_landing_page`, `create_landing_page`, `update_landing_page`, `publish_landing_page`, `unpublish_landing_page`, `duplicate_landing_page`, `delete_landing_page`, `connect_landing_page_domain`, and `update_landing_page_domain_settings`\n\n## Sequences\n\n```bash\nsequenzy sequences list\nsequenzy sequences get seq_123\nsequenzy sequences create onboarding --trigger event_received --event-name signup.completed --goal \"Guide new users to activation\" --email-count 4\nsequenzy sequences create onboarding --trigger contact_added --list-id list_123 --steps-file ./steps.json\nsequenzy sequences create winback --trigger tag_added --tag-name cancelled --steps-file ./discount-steps.json\nsequenzy sequences update seq_123 --steps-file ./sequence-updates.json\nsequenzy sequences update seq_123 --branch-file ./branch.json\nsequenzy sequences render seq_123 --out preview.html\nsequenzy sequences test seq_123 --node-id node_email_2 --to you@example.com\nsequenzy sequences enable seq_123\nsequenzy sequences disable seq_123\nsequenzy sequences duplicate seq_123 --name \"Onboarding v2\"\nsequenzy sequences archive seq_123\nsequenzy sequences unarchive seq_123\nsequenzy sequences enrollments seq_123 --status active waiting\nsequenzy sequences enrollments seq_123 --all --csv enrollments.csv\nsequenzy sequences pause-enrollments seq_123\nsequenzy sequences resume-enrollments seq_123\nsequenzy sequences delete seq_123\nsequenzy sequences enroll seq_123 --email one@example.com two@example.com\nsequenzy sequences enroll seq_123 --emails-file ./vips.csv\nsequenzy sequences enroll seq_123 --email one@example.com --target-node-id node_email_2\nsequenzy sequences cancel-enrollments seq_123 --subscriber-id sub_123 --reason \"Converted\"\nsequenzy sequences cancel-enrollments seq_123 --field-path order.id --field-values ord_123,ord_456\nsequenzy sequences cancel-enrollments seq_123 --field-values price_123 --apply\n```\n\nBehavior:\n\n- `sequences list`: `GET /api/v1/sequences` with `--status`, `--search`, `--label`, `--limit`, and `--offset` filters\n- `sequences get`: `GET /api/v1/sequences/:id`\n- `sequences create`: `POST /api/v1/sequences`\n- `sequences update`: `PUT /api/v1/sequences/:id`\n- `sequences render`: `GET /api/v1/sequences/:sequenceId/nodes/:nodeId/render`; same personalization and output flags as `campaigns render`, plus `--variant` for A/B nodes\n- `sequences test --node-id <id> --to <email>` sends only the selected saved email step; it does not enable the sequence or enroll subscribers - use `sequences get` first to find the email step nodeId (MCP: `send_sequence_test_email`)\n- `sequences enable`: `POST /api/v1/sequences/:id/enable`\n- `sequences disable`: `POST /api/v1/sequences/:id/disable`\n- `sequences duplicate`: `POST /api/v1/sequences/:id/duplicate`; email templates, graph topology, and sequence A/B tests are copied independently (MCP: `duplicate_sequence`)\n- `sequences archive` / `unarchive` hide or restore a sequence without deleting it (MCP: `archive_sequence`, `unarchive_sequence`)\n- `sequences enrollments`: `GET /api/v1/sequences/:id/enrollments`; defaults to active and waiting enrollments, filters by `--status`, `--node-id`, `--subscriber-id`, and `--email`, and exports with `--all --csv <file>`. `waitUntil` is when a waiting enrollment resumes. Get node IDs from `sequences get` or `stats --sequence` (MCP: `list_sequence_enrollments`)\n- `sequences pause-enrollments` stops new entrants while existing active and waiting recipients keep moving (the sequence must be active; use `disable` to freeze current recipients too); `resume-enrollments` reopens entry (MCP: `pause_sequence_enrollments`, `resume_sequence_enrollments`)\n- `sequences delete`: `DELETE /api/v1/sequences/:id`\n- `sequences enroll`: `POST /api/v1/sequences/:id/enroll`\n- `sequences cancel-enrollments`: `POST /api/v1/sequences/:id/enrollments/cancel`\n- dashboard-aware responses include `url` on sequence records and `appUrls` on the top-level JSON when the company can be resolved\n\nGoals and inbound webhooks:\n\n- `sequences goals list|create|update|delete` manage conversion goals on `/api/v1/sequences/:id/goals[/:goalId]`; `create <sequenceId> <name>` and `update` accept `--active`/`--inactive` (MCP: `list_sequence_goals`, `create_sequence_goal`, `update_sequence_goal`, `delete_sequence_goal`)\n- `sequences webhook get|configure|rotate <sequenceId>` manage the sequence's inbound trigger webhook; `configure` accepts `--field-mapping-json/-file` and `--sample-payload-json/-file` (with `--clear-*` variants), and `rotate` replaces the signing secret (MCP: `get_sequence_inbound_webhook`, `configure_sequence_inbound_webhook`, `rotate_sequence_inbound_webhook_secret`)\n\nCaveats:\n\n- CLI sequence creation supports either AI `--goal` mode or explicit `--steps-json` / `--steps-file` mode\n- explicit create steps can include `{ \"type\": \"create_discount\" }`; emails after that action can reference `{{discount.code}}`, `{{discount.percentOff}}`, and related `discount.*` merge tags\n- discount action sequences require a connected Stripe integration before activation\n- `--email-count` is only meaningful with `--goal`\n- `--email-count` accepts 1 to 10 generated emails\n- trigger-specific options depend on `--trigger`\n- updates accept either step payloads or email payloads via `--steps-*` or `--emails-*`, not both; entries can target a step by `nodeId`, `emailId`, or array order\n- `--insert-steps-json/-file` adds new linear steps (including outbound webhook and SMS steps); `--node-updates-json/-file` and `--graph-edit-json/-file` edit and rewire existing nodes (MCP: `insert_sequence_step`, `update_sequence_node`, `update_sequence_nodes`, `edit_sequence_graph`)\n- SMS steps use `{\"type\":\"sms\",\"text\":\"...\"}` (optional `label`, `ineligibleAction skip|exit`, `imageUrls`); edit existing ones with `--sms-steps-json/-file`. Update Subscriber steps use `type=\"update_subscriber\"` with attribute updates like `{{event.plan}}`; edit with `--subscriber-update-steps-json/-file`\n- inserting steps or branches into an active sequence requires `--confirm-structural-change`\n- `--stop-condition-json/-file` sets the sequence stop condition (e.g. `{\"type\":\"has_tag\",\"value\":\"customer\"}`; `{\"type\":\"none\",\"value\":null}` clears it). Stop conditions are re-evaluated before every step including the first, so `does_not_have_tag` / `removed_from_list` act as an allowlist: guarded-out contacts still enroll and are cancelled at the trigger node. Clearing the guard does not retry contacts it already cancelled - re-enroll them with `sequences enroll`, which skips the `one_time` check\n- create and update share trigger flags (`--trigger`, `--list-id`, `--tag-name`, `--segment-id`, `--event-name`, `--integration-slug`/`--integration-event-key`, `--inactive-days`, `--min-count`/`--time-window-days`) plus `--property-filters-json/-file` to only start when event properties match (e.g. scope a purchase seque\n\nFile v1.6.0:references/use-cases.md\n\n# Use Cases\n\n## Pick The Right Flow\n\n### \"Log into Sequenzy on this machine\"\n\nUse:\n\n```bash\nsequenzy login\n```\n\nThen verify:\n\n```bash\nsequenzy whoami\n```\n\nPrefer `SEQUENZY_API_KEY` instead when the task is fully non-interactive or running in CI.\n\n## \"Check whether I am authenticated\"\n\nUse:\n\n```bash\nsequenzy whoami\n```\n\nInterpretation:\n\n- success means a local API key is available\n- failure means the agent should ask for login or a `SEQUENZY_API_KEY`\n\nRemember that this is local-state validation, not a fresh server-side account lookup.\n\n## \"Show me account or company info\"\n\nUse:\n\n```bash\nsequenzy account\nsequenzy companies list\nsequenzy companies get comp_123\nsequenzy urls --company comp_123\n```\n\nChoose:\n\n- `account` for user ID, current company, and accessible companies\n- `companies list` for a compact list with localization info\n- `companies get` when the user already has a company ID\n- `urls` when the user needs a dashboard/settings link\n\n## \"Open, review, or edit something I just created\"\n\nPrefer the `url` or `appUrls` fields returned by recent CLI/MCP calls. If you need to generate links from IDs:\n\n```bash\nsequenzy urls --company comp_123 --sequence seq_123\nsequenzy urls --company comp_123 --campaign camp_123\nsequenzy urls --company comp_123 --settings-tab integrations\n```\n\nMCP equivalent: call `get_app_urls` with:\n\n```json\n{\n  \"companyId\": \"comp_123\",\n  \"sequenceId\": \"seq_123\",\n  \"settingsTab\": \"integrations\"\n}\n```\n\nURL patterns:\n\n- sequence editor: `/dashboard/company/{companyId}/sequences/{sequenceId}`\n- campaign editor: `/dashboard/company/{companyId}/campaign/{campaignId}`\n- template/email editor: `/dashboard/company/{companyId}/emails/{emailId}`\n- settings: `/dashboard/company/{companyId}/settings`\n- settings tab: `/dashboard/company/{companyId}/settings?tab={tab}`\n\nAfter generating a sequence or campaign, give the user the relevant review/edit URL instead of only returning the ID.\n\n## \"Show me delivery performance\"\n\nUse:\n\n```bash\nsequenzy stats\nsequenzy stats --period 30d\nsequenzy stats --campaign camp_123\nsequenzy stats --sequence seq_123\n```\n\nChoose:\n\n- plain `stats` for account-level overview\n- `--campaign` when the user gives a campaign ID\n- `--sequence` when the user gives a sequence ID\n\nAsk for the missing ID instead of guessing.\n\n## \"Add or update a subscriber\"\n\nWhat works today:\n\n```bash\nsequenzy subscribers add user@example.com --tag premium --attr name=John\nsequenzy subscribers add user@example.com --tag premium --tag beta --company comp_123\nsequenzy subscribers get user@example.com\nsequenzy subscribers list --list \"Master List\" --json\n```\n\nGuidance:\n\n- use `add` for single-recipient creation or upsert\n- use repeated `--attr key=value` pairs for metadata\n- repeated `--tag` values are supported\n- use `--company` when the API key can access multiple companies\n- use `subscribers get` when you need the full profile, list memberships, sequence enrollments, email stats, or recent activity\n- use `subscribers list --list <id-or-exact-name> --json` to export subscribers from one list; omit `--limit` to fetch every page\n\nWhat does not work well today:\n\n- advanced subscriber workflows across many records\n\nFor bulk list population, do not loop over `subscribers add`. Use:\n\n```bash\nsequenzy lists add-subscribers list_123 --emails-file ./batch-001.csv\nsequenzy lists import list_123 --emails-file ./batch-001.csv\n```\n\nGuidance:\n\n- `lists import` is an alias for `lists add-subscribers`\n- accepted input formats are repeated `--email`, `--emails-json`, or `--emails-file`\n- files may be newline-separated, CSV with an email column, a JSON email array, or a JSON object with `emails` or `subscribers`\n- CSV headers named `email`, `e-mail`, `email address`, or `mail` are detected; otherwise the first column is used\n- the CLI splits files into API-safe batches of up to 500 emails\n- use this path instead of one API call per subscriber\n\n## \"Remove a subscriber\"\n\nUse:\n\n```bash\nsequenzy subscribers list --tag vip\nsequenzy subscribers get user@example.com\nsequenzy subscribers remove user@example.com\n```\n\nUse `--hard` only when the task explicitly requires permanent deletion:\n\n```bash\nsequenzy subscribers remove user@example.com --hard\n```\n\nNotes:\n\n- plain `remove` performs a full unsubscribe workflow rather than a hard delete\n- use `--company` when operating with a personal API key across multiple companies\n\n## \"Send one transactional email\"\n\nTemplate flow:\n\n```bash\nsequenzy send user@example.com --template tmpl_123 --var name=John\n```\n\nRaw HTML flow:\n\n```bash\nsequenzy send user@example.com --subject \"Status update\" --html-file ./email.html --var orderId=123\n```\n\nChecklist:\n\n1. Confirm recipient email.\n2. Confirm template ID or HTML source.\n3. Confirm subject when sending raw HTML.\n4. Confirm merge variables as `key=value`.\n\nThis command is for one-off transactional send behavior, not bulk campaign sends.\n\n## \"Create a list, tag view, or saved segment\"\n\nWhat works today:\n\n```bash\nsequenzy lists create Newsletter --description \"Public newsletter list\"\nsequenzy lists update list_123 --name \"Weekly Newsletter\" --private\nsequenzy lists remove-subscribers list_123 --emails-file ./churned.csv\nsequenzy lists delete list_123 --yes\nsequenzy tags list\nsequenzy tags create vip --color purple\nsequenzy tags update tag_123 --color red\nsequenzy tags delete tag_123 --yes\nsequenzy segments list\nsequenzy segments count seg_123\nsequenzy segments create --name \"Bought Pro\" --stripe-product prod_pro\nsequenzy segments create --name \"VIP or Churn Risk\" --match any --filter-json '[{\"field\":\"tag\",\"operator\":\"contains\",\"value\":\"vip\"},{\"field\":\"emailOpened\",\"operator\":\"is_not\",\"value\":\"30d\"}]'\nsequenzy segments create --name \"Active non-paying\" --filter-json '{\"kind\":\"group\",\"id\":\"root\",\"joinOperator\":\"and\",\"children\":[{\"kind\":\"filter\",\"id\":\"f1\",\"field\":\"attribute\",\"operator\":\"gte\",\"value\":\"last_login_days_ago:0\"},{\"kind\":\"group\",\"id\":\"g1\",\"joinOperator\":\"or\",\"children\":[{\"kind\":\"filter\",\"id\":\"f2\",\"field\":\"attribute\",\"operator\":\"is_empty\",\"value\":\"plan_end\"},{\"kind\":\"filter\",\"id\":\"f3\",\"field\":\"attribute\",\"operator\":\"lt\",\"value\":\"plan_end:2026-04-21\"}]}]}'\nsequenzy segments update seg_123 --name \"Churn Risk\" --join-operator or\nsequenzy segments delete seg_123 --yes\n```\n\nFor Stripe purchase thresholds:\n\n```bash\nsequenzy segments create --name \"3+ Pro Payments\" --stripe-product prod_pro --purchase-operator at-least --payments 3\n```\n\nGuidance:\n\n- bare `sequenzy tags` still lists tag definitions; `tags create`, `tags update`, and `tags delete` mutate them\n- tag names are normalized to lowercase with dashes, system tags cannot be changed or deleted, and tags used by sequences cannot be deleted\n- deleting a tag removes it from every subscriber, so confirm intent before running `tags delete`\n- `lists update` changes name, description, or visibility; `lists remove-subscribers` only removes memberships, while `lists delete` removes the whole list and all of its memberships (subscribers themselves are kept)\n- `segments update` replaces the filter set; run `segments count` afterwards to confirm the new size\n- use Stripe product IDs, not product names\n- use `--filter-json` when the user needs a non-Stripe, mixed, nested, custom event, or saved-segment payload\n- use `--match any` when the segment should match any top-level filter instead of all filters\n- `segments count` is the quickest way to preview impact before using a segment in a campaign\n\nFor MCP-driven workflows, `create_segment` supports the same legacy filter array with `filterJoinOperator: \"or\"` for match-any segments:\n\n```json\n{\n  \"filterJoinOperator\": \"or\",\n  \"filters\": [\n    {\n      \"id\": \"filter-1\",\n      \"field\": \"stripeProduct\",\n      \"operator\": \"at_least\",\n      \"value\": \"prod_pro:3\"\n    }\n  ]\n}\n```\n\nFor nested AND/OR logic, send a `root` instead of `filters`. Event filters use `field: \"event\"` and values like `saas.purchase:30d` or `saas.purchase:5:30d`; segment-of-segment filters use `field: \"segment\"` with the referenced segment id as `value`.\n\n```json\n{\n  \"root\": {\n    \"kind\": \"group\",\n    \"id\": \"root\",\n    \"joinOperator\": \"and\",\n    \"children\": [\n      {\n        \"kind\": \"filter\",\n        \"id\": \"filter-1\",\n        \"field\": \"event\",\n        \"operator\": \"at_least\",\n        \"value\": \"saas.purchase:2:30d\"\n      },\n      {\n        \"kind\": \"filter\",\n        \"id\": \"filter-2\",\n        \"field\": \"segment\",\n        \"operator\": \"is_not\",\n        \"value\": \"seg_churned\"\n      }\n    ]\n  }\n}\n```\n\n## \"Create or manage a template\"\n\nWhat works today:\n\n```bash\nsequenzy templates list\nsequenzy templates list --label edm\nsequenzy templates get tmpl_123\nsequenzy templates create welcome --subject \"Welcome\" --label edm --html-file ./welcome.html\nsequenzy templates create welcome --subject \"Welcome\" --blocks-file ./welcome-blocks.json\nsequenzy templates update tmpl_123 --subject \"Updated\" --label edm --html-file ./welcome-v2.html\nsequenzy templates update tmpl_123 --blocks-file ./welcome-v2-blocks.json\n```\n\nGuidance:\n\n- use block JSON when the user needs conditional content or an exact editor-compatible structure\n- use HTML input for simpler one-off content; this API path stores raw HTML as a single text block\n- use `--label` on `list` to filter by label, and on `create` or `update` to assign replacement labels\n- a conditional block uses a block-level `condition` object with merge-tag variable names and no `{{ }}` braces\n- use `get` before `update` or `delete` when the user is uncertain about the target ID\n- warn that delete can fail when the template is still referenced by a campaign or sequence\n\n## \"Create or manage a campaign\"\n\nWhat works today:\n\n```bash\nsequenzy campaigns list --status draft --label edm\nsequenzy campaigns get camp_123\nsequenzy campaigns create \"April Launch\" --prompt \"Announce our new dashboard\"\nsequenzy campaigns create \"April Launch\" --subject \"We shipped\" --label edm --html-file ./campaign.html\nsequenzy campaigns create \"April Launch\" --subject \"We shipped\" --blocks-file ./campaign-blocks.json\n\n# Ask for feedback with a poll block inside the campaign blocks JSON:\n# {\"type\":\"poll\",\"variant\":\"options\",\"question\":\"What did you think?\",\n#  \"options\":[{\"label\":\"Loved it\",\"value\":\"loved\"},{\"label\":\"Not for me\",\"value\":\"not_for_me\"}],\n#  \"attributeKey\":\"email_feedback\"}\n# or an NPS survey: {\"type\":\"poll\",\"variant\":\"nps\",\"question\":\"How likely are you to recommend us?\",\"options\":[],\"attributeKey\":\"nps_score\"}\n# Answers land in the subscriber attribute, fire a poll.answered event, and\n# aggregate into the campaign stats \"polls\" array.\nsequenzy campaigns update camp_123 --subject \"Updated subject\" --label edm\nsequenzy campaigns update camp_123 --blocks-file ./campaign-v2-blocks.json\nsequenzy campaigns update camp_123 --reply-to support@example.com\nsequenzy campaigns update camp_123 --reply-profile reply_123\nsequenzy campaigns schedule camp_123 --at \"2026-06-01T14:00:00Z\"\nsequenzy campaigns test camp_123 --to you@example.com\nsequenzy campaigns duplicate camp_123\nsequenzy campaigns delete camp_123 --yes\n```\n\nGuidance:\n\n- the CLI handles draft creation, draft updates, inspection, scheduling, test requests, duplication, deletion, and lifecycle control (cancel, pause, resume)\n- create, get, update, schedule, list, and test outputs include dashboard URLs when the company can be resolved; campaign outputs include a review `previewUrl`\n- use `--prompt` for AI-generated draft content; do not combine it with HTML or block flags\n- use `--label` on `list` to filter by campaign label, and on `create` or `update` to assign replacement labels\n- use block JSON when the user needs conditional content or an exact editor-compatible structure\n- use `--reply-to` when the user knows the reply profile email and it already exists for the company\n- use `--reply-profile` when the user already has the reply profile ID\n- do not pass `--reply-to` and `--reply-profile` together\n- use `campaigns get` after an update when you want to confirm the saved reply-to details\n- use `campaigns schedule --at <future ISO datetime>` when the user asks to schedule a campaign; it requires a verified sending domain\n- use `--target-lists-json` or `--target-lists-file` only when the user explicitly needs new targeting at schedule time\n- there is no CLI command for immediately sending a campaign; schedule with a near-future `--at` timestamp instead\n- use `campaigns duplicate` to clone a campaign as a new draft; `--mode ab_test` also copies its A/B test and `--mode variant --variant-id <id>` copies one variant's content\n- `campaigns delete` only works once the campaign is not sending, scheduled, or paused; cancel it first\n- in the current backend checkout, `campaigns test` returns a success message path rather than confirmed delivery\n\nFor MCP-driven campaign updates, `update_campaign` supports labels and the same reply-to behavior:\n\n```json\n{\n  \"campaignId\": \"camp_123\",\n  \"labels\": [\"edm\"],\n  \"replyTo\": \"support@example.com\"\n}\n```\n\nFor MCP-driven scheduling, call `schedule_campaign`:\n\n```json\n{\n  \"campaignId\": \"camp_123\",\n  \"scheduledAt\": \"2026-06-01T14:00:00Z\",\n  \"targetLists\": { \"type\": \"all\" }\n}\n```\n\nUse `replyProfileId` instead when the caller already has the reply profile ID, and never send both fields together.\n\nPreferred fallback for unsupported campaign workflows:\n\n- use the dashboard\n- use direct API calls only if the task explicitly allows it and the relevant API is available\n\n## \"Stop a campaign that is scheduled or already sending\"\n\nUse:\n\n```bash\nsequenzy campaigns get camp_123\nsequenzy campaigns cancel camp_123\nsequenzy campaigns pause camp_123\nsequenzy campaigns resume camp_123 --spread-over-hours 6\n```\n\nDecide between cancel, pause, and resume:\n\n- use `cancel` when the send should not continue at all; it is permanent and works from scheduled, sending, paused, waiting-approval, and rejected statuses\n- use `pause` when the user wants to stop a send temporarily and may continue it; it only works while the campaign is in sending status\n- use `resume` to continue a paused campaign, optionally spreading the remaining delivery with `--spread-over-hours` (1-72)\n- `cancel` needs no `--yes` and shows no confirmation prompt, so it is the fastest way to stop a bad send; run it first and ask questions after when the user reports a mistake\n- check `campaigns get` first when you are unsure of the current status; the API rejects transitions from the wrong status\n\nMCP equivalents are `cancel_campaign`, `pause_campaign`, and `resume_campaign` (optional `spreadOverHours`).\n\n## \"Run an A/B test on a campaign\"\n\nUse:\n\n```bash\nsequenzy campaigns get camp_123\nsequenzy ab-tests create camp_123 --test-percentage 20 --duration-minutes 240 --winner-criteria open_rate\nsequenzy ab-tests add-variant ab_123 --subject \"Alternative subject\"\nsequenzy ab-tests get ab_123\nsequenzy ab-tests update-variant ab_123 var_b --subject \"New subject\"\nsequenzy ab-tests delete-variant ab_123 var_c --yes\nsequenzy ab-tests stats ab_123 --period 7d\n```\n\nGuidance:\n\n- the campaign must be in draft or rejected status and must not already have an A/B test\n- variant A is created automatically from the campaign email and is the protected control; it cannot be deleted\n- a test holds 2 to 5 variants; structure changes (add, edit, delete variants) are only allowed while the test is in draft status; sequence tests whose parent sequence is active additionally require `--confirm-live-change` (`confirmLiveChange` over MCP) to add or delete variants\n- `--test-percentage` (5-50), `--duration-minutes` (15-1440), and `--winner-criteria open_rate|click_rate` control how the winner is picked once the campaign is scheduled\n- use `ab-tests get` to find variant IDs, `ab-tests stats` to compare results after sending, and `ab-tests delete` (draft or finished tests only) to remove a test\n- `campaigns duplicate camp_123 --mode ab_test` clones a campaign together with its A/B test\n- MCP equivalents are `create_ab_test`, `add_ab_test_variant`, `update_ab_test_variant`, `delete_ab_test_variant`, `delete_ab_test`, `get_ab_test`, and `get_ab_test_stats`\n\n## \"Create or manage a sequence\"\n\nWhat works today:\n\n```bash\nsequenzy sequences list\nsequenzy sequences get seq_123\nsequenzy sequences create onboarding --trigger event_received --event-name signup.completed --goal \"Guide new users to activation\" --email-count 4\nsequenzy sequences create onboarding --trigger contact_added --list-id list_123 --steps-file ./steps.json\nsequenzy sequences create winback --trigger tag_added --tag-name cancelled --steps-file ./discount-steps.json\nsequenzy sequences update seq_123 --steps-file ./sequence-updates.json\nsequenzy sequences enable seq_123\nsequenzy sequences disable seq_123\nsequenzy sequences cancel-enrollments seq_123 --subscriber-id sub_123\nsequenzy sequences cancel-enrollments seq_123 --field-path order.id --field-values ord_123,ord_456\nsequenzy sequences cancel-enrollments seq_123 --field-values price_123 --apply\n```\n\nMinimal `steps.json` shape:\n\n```json\n[\n  {\n    \"subject\": \"Welcome to Acme\",\n    \"html\": \"<p>Hi there</p>\",\n    \"delay\": { \"days\": 0 }\n  },\n  {\n    \"subject\": \"Day 3 follow-up\",\n    \"html\": \"<p>Here is the next step</p>\",\n    \"delay\": { \"days\": 3 }\n  }\n]\n```\n\nDiscount step shape:\n\n```json\n[\n  {\n    \"type\": \"create_discount\",\n    \"label\": \"Create win-back discount\",\n    \"discountType\": \"percent\",\n    \"percentOff\": 20,\n    \"duration\": \"once\",\n    \"appliesToAllPlans\": true,\n    \"maxRedemptions\": 1,\n    \"codePrefix\": \"WINBACK\"\n  },\n  {\n    \"subject\": \"Come back with {{discount.code}}\",\n    \"html\": \"<p>Use {{discount.code}} for {{discount.percentOff}}% off.</p>\",\n    \"delay\": { \"days\": 1 }\n  }\n]\n```\n\nBranch insertion shape for \"clicked invite, otherwise remind\":\n\n```json\n{\n  \"afterNodeId\": \"node_email\",\n  \"branches\": [\n    {\n      \"conditionType\": \"link_clicked\",\n      \"linkUrl\": \"project-invites\",\n      \"activityScope\": \"previous_email\",\n      \"steps\": [\n        {\n          \"subject\": \"Project invite accepted\",\n          \"html\": \"<p>Here is your next project step.</p>\"\n        }\n      ]\n    }\n  ],\n  \"elseSteps\": [\n    {\n      \"subject\": \"Reminder: accept your invite\",\n      \"html\": \"<p>Please accept your project invite.</p>\"\n    }\n  ]\n}\n```\n\nGuidance:\n\n- CLI sequence creation supports either AI `--goal` mode or explicit step files\n- create, get, update, and list outputs include dashboard URLs when the company can be resolved\n- choose the correct trigger options for `--trigger`\n- use `--goal` when you want AI-generated drafts, or `--steps-file` when you already know the exact step content\n- discount action steps require Stripe to be connected before activation\n- use either `--steps-file` or `--emails-file` for update\n- use `--branch-file` for if/else insertion; branch conditions support tag, list, segment, event, clicked-link, and field checks\n- for `link_clicked`, set `linkUrl` to part of the target URL or omit it to match any tracked click\n- for `event_received` and `link_clicked`, set `activityScope` to `this_sequence`, `previous_email`, or `ever`\n- enable/disable are real CLI actions\n\n## \"Stop people in a sequence\"\n\nUse:\n\n```bash\nsequenzy sequences cancel-enrollments seq_123 --subscriber-id sub_123 --reason \"Converted\"\nsequenzy sequences cancel-enrollments seq_123 --field-path order.id --field-values ord_123,ord_456\nsequenzy sequences cancel-enrollments seq_123 --field-values price_123 --apply\n```\n\nGuidance:\n\n- require the sequence ID; never attempt cross-sequence cancellation from only an event or field value\n- use `--subscriber-id` when the caller knows the exact subscriber enrollment to stop\n- use `--field-values` when the caller wants to stop all active/waiting enrollments whose stored entry event property matches specific IDs\n- include `--field-path` unless the sequence already has the correct `enrollmentFieldPath`\n- omit `--apply` for a dry run; pass `--apply` only after reviewing the matched count\n- MCP equivalent is `cancel_sequence_enrollments` with exactly one of `subscriberId` or `fieldValues`; set `dryRun: false` to apply a field-value cancellation\n\n## \"Enroll existing subscribers into a sequence\"\n\nUse:\n\n```bash\nsequenzy sequences get seq_123\nsequenzy sequences enroll seq_123 --email one@example.com two@example.com\nsequenzy sequences enroll seq_123 --emails-file ./vips.csv\nsequenzy sequences enroll seq_123 --email one@example.com --target-node-id node_email_2\n```\n\nGuidance:\n\n- use `enroll` when subscribers should enter a sequence now instead of waiting for its trigger (for example, back-filling a new onboarding sequence with existing contacts)\n- the sequence must be accepting entrants: enabled and not paused for enrollment\n- provide exactly one email source: repeated `--email`, `--emails-json`, or `--emails-file`; the CLI batches large inputs into 500-email requests\n- only active subscribers are enrolled; the result reports `notFound` for unknown emails and `skipped` for inactive or already-enrolled subscribers, so check those counts instead of assuming everyone entered\n- enrollment starts at the first step after the trigger unless `--target-node-id` points at a specific node; use `sequences get` first to find node IDs\n- MCP equivalent is `enroll_subscribers_in_sequence` with `emails` and optional `targetNodeId`\n\n## \"Create an API key or inspect website/domain setup\"\n\nUse:\n\n```bash\nsequenzy api-keys create --name \"CI deploy key\" --company comp_123\nsequenzy websites list --company comp_123\nsequenzy websites add example.com --company comp_123\nsequenzy websites check example.com --company comp_123\nsequenzy websites guide --framework nextjs --use-case transactional\n```\n\nGuidance:\n\n- save newly created API credentials immediately to a user-approved secure destination such as a password manager, secret store, encrypted file, or local `.env` file outside version control. Do not paste credential material into chat, logs, tickets, or public transcripts; report only the storage location and a short fingerprint.\n- use `websites check` when the user needs DNS verification details\n- use `websites guide` for integration code snippets rather than inventing framework examples\n\n## \"Sell a digital product and deliver the file after purchase\"\n\nWhat works today:\n\n```bash\nsequenzy products sync\nsequenzy products list --provider stripe\nsequenzy products attach-file <product-id> --file ./guide.pdf\n```\n\nThen create the delivery sequence on the purchase event:\n\n```bash\nsequenzy sequences create ebook-delivery \\\n  --trigger event_received \\\n  --event-name saas.purchase \\\n  --steps-json '[{\"type\":\"email\",\"subject\":\"Your download is ready\",\"html\":\"<p>Thanks for your purchase! <a href=\\\"{{event.download.url}}\\\">Download {{event.download.name}}</a></p>\"}]'\n```\n\nGuidance:\n\n- sync first so the Stripe catalog exists locally, then take the internal product ID from `products list`\n- `attach-file --file` uploads the file to Sequenzy storage in one step; use `--url` when the file is hosted elsewhere\n- the purchase event carries `download.url` and `download.name` only for products that have an attached file; `downloads` contains all files when an order has several products\n- per-product filtering (start the sequence only when one specific product is bought) is configured in the dashboard sequence trigger via the \"Only for product\" picker or a `productIds equals <stripe product id>` property filter; trigger property filters are not currently settable through the CLI or MCP, so say so and link the sequence editor URL\n- buyers become subscribers automatically when the Stripe purchase webhook arrives, so delivery works for brand-new customers\n- MCP flows use `list_products` + `attach_product_file`, then `create_sequence` with the same event trigger\n\n## \"Invite a teammate\"\n\nUse:\n\n```bash\nsequenzy team list\nsequenzy team invite teammate@example.com --role admin\nsequenzy team invite finance@example.com --role viewer --billing-access\nsequenzy team cancel-invitation inv_123 --yes\n```\n\nGuidance:\n\n- `--role` is `admin` (can manage the workspace) or `viewer` (read-only); choose `viewer` unless the user explicitly needs management access\n- `--billing-access` can only be granted by the company owner; expect a permission error otherwise\n- existing Sequenzy users join the team immediately; new emails receive an invitation that expires after 14 days\n- use `team list` to see the owner, members, and pending or expired invitations, and to find invitation IDs before cancelling\n- MCP equivalents are `list_team_members`, `invite_team_member`, and `cancel_team_invitation`\n\n## \"Triage and reply to inbox conversations\"\n\nUse:\n\n```bash\nsequenzy inbox list --status open --unread\nsequenzy inbox get conv_123\nsequenzy inbox reply conv_123 --text \"Thanks for reaching out!\"\nsequenzy inbox reply conv_123 --text \"Customer asked for a refund\" --note\nsequenzy inbox mark-read conv_123\nsequenzy inbox close conv_123\n```\n\nGuidance:\n\n- triage flow: `inbox list --unread` to find conversations needing attention, `inbox get` to read the full message history, then `inbox reply`, `mark-read`, and `close`\n- use `--note` to record internal context (decisions, escalations) without emailing the subscriber\n- outbound replies are sent asynchronously by a worker, so report the message as queued rather than delivered; replies also reopen closed conversations\n- use `--search` to find conversations by subscriber email, name, or subject, and `--status open|closed|all` plus `--page`/`--limit` for larger inboxes\n- MCP equivalents are `list_conversations`, `get_conversation`, `reply_to_conversation`, `update_conversation_status`, and `mark_conversation_read`\n\n## \"Manage outbound webhooks\"\n\nUse:\n\n```bash\nsequenzy webhooks create --name CI --url https://example.com/hook --event email.bounced subscriber.unsubscribed\nsequenzy webhooks list\nsequenzy webhooks test wh_123\nsequenzy webhooks deliveries wh_123 --limit 50\nsequenzy webhooks replay wh_123 del_456\nsequenzy webhooks update wh_123 --disable\nsequenzy webhooks delete wh_123 --yes\n```\n\nGuidance:\n\n- `create` returns one-time signing-secret material; handle it as sensitive output. Save it only to a user-approved secure destination such as a password manager, secret store, encrypted file, or local `.env` file outside version control. Do not paste credential material into chat, logs, tickets, or public transcripts; report only the storage location and a short fingerprint.\n- pick events from the 13 supported `email.*`, `subscriber.*`, and `sequence.*` types, or omit `--event` for the default set\n- debug delivery problems with `test` (fires a test event), `deliveries` (recent attempts with status codes and errors), and `replay` (re-sends one delivery)\n- use `update --disable`/`--enable` to toggle an endpoint; re-enabling or changing the URL resets the failure circuit breaker\n- `delete` permanently removes the endpoint and its delivery history; use `update --disable` to keep it\n- MCP equivalents are `list_webhooks`, `create_webhook`, `update_webhook`, `delete_webhook`, `test_webhook`, `list_webhook_deliveries`, and `replay_webhook_delivery`\n\n## \"Generate email content with AI\"\n\nUse the CLI when the user wants draft copy or structured generated output:\n\n```bash\nsequenzy generate email \"Welcome email for new SaaS trial users\"\nsequenzy generate sequence \"Onboarding for SaaS trial users\" --count 4 --days 14\nsequenzy generate subjects \"Black Friday sale\" --count 5\n```\n\nGuidance:\n\n- use `--json` when another agent or tool should parse the result\n- generated content is draft content and should be reviewed before sending\n- sequence generation accepts at most 10 emails\n- use `sequenzy campaigns create \"Name\" --prompt \"...\"` when the user wants to create a draft campaign from generated content in one step\n\n## \"Report a gap or product feedback to the Sequenzy team\"\n\nUse this whenever the user wanted something the CLI/MCP surface does not support, or hit a bug:\n\n```bash\nsequenzy feedback \"No command to bulk-delete campaigns by label\" --category missing_capability\nsequenzy feedback \"Segment count and list output disagree for seg_123\" --category bug --context \"Auditing a re-engagement segment\"\n```\n\nGuidance:\n\n- always send a feedback report after telling the user a workflow is unsupported; the Sequenzy team reads every submission and uses it to prioritize\n- be specific: what was needed, what was missing or wrong, and what the fallback was\n- categories: `missing_capability`, `bug`, `docs`, `ux`, `praise`, `other` (default `other`)\n- MCP equivalent is `submit_feedback`; never include secrets or API keys in the message\n\nFile v1.6.0:skill-card.md\n\n## Description:\n\nGuides agents through Sequenzy email-marketing operations, including authentication, subscriber management, campaign and sequence workflows, templates, transactional sends, analytics, and supported workflow checks.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[polnikale](https://clawhub.ai/user/polnikale)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal Sequenzy operators and developers use this skill to select safe CLI or MCP workflows for email-marketing account operations, from subscriber and audience management through campaigns, sequences, transactional sends, and reporting.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can guide agents through privileged Sequenzy account operations that affect subscribers, campaigns, sequences, team access, API keys, and webhooks.\n\nMitigation: Install only for agents trusted to operate the relevant Sequenzy account, and require explicit confirmation before destructive actions, live or scheduled campaign changes, team changes, API-key changes, and webhook operations.\n\nRisk: The skill includes feedback workflows that may send business context, identifiers, incidents, or customer information to the Sequenzy team.\n\nMitigation: Review and approve the exact feedback text before submission, and do not allow automatic feedback reports that include sensitive or customer information.\n\nRisk: Some workflows produce or handle sensitive one-time credentials such as API keys and webhook signing secrets.\n\nMitigation: Redact secrets from chat, logs, tickets, and public transcripts, and store any required values only in a user-approved secure destination.\n\n## Reference(s):\n\n- [Command Reference](references/command-reference.md)\n- [Use Cases](references/use-cases.md)\n- [ClawHub Skill Page](https://clawhub.ai/polnikale/skills/sequenzy-email-marketing)\n- [Sequenzy Application](https://sequenzy.com)\n- [Sequenzy API](https://api.sequenzy.com)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, shell commands, configuration, text, markdown]\n\n**Output Format:** [Markdown guidance with CLI commands and configuration snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include API-call guidance, dashboard URLs, and sensitive-output handling instructions.]\n\n## Skill Version(s):\n\n1.6.0 (source: release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.6.0:agents/openai.yaml\n\ninterface:\n  display_name: \"Sequenzy Email Marketing\"\n  short_description: \"Agent guide for using Sequenzy safely\"\n  default_prompt: \"Use $sequenzy-email-marketing to choose the right Sequenzy workflow and complete the task safely.\"\n\nArchive v1.4.0: 6 files, 27277 bytes\n\nFiles: agents/openai.yaml (233b), references/command-reference.md (36523b), references/use-cases.md (27818b), skill-card.md (2871b), SKILL.md (10173b), _meta.json (143b)\n\nFile v1.4.0:SKILL.md\n\n---\nname: sequenzy-email-marketing\ndescription: Primary agent guide for operating Sequenzy as an email-marketing platform. Use when Codex needs to authenticate, inspect identity, manage subscribers, create or edit campaigns/sequences/templates, control the campaign lifecycle (cancel, pause, resume, delete, duplicate), run campaign A/B tests, mutate lists/tags/segments, enroll subscribers into sequences, invite team members, triage and reply to inbox conversations, manage outbound webhooks, generate draft email content, send transactional email, read delivery stats, or decide whether a requested Sequenzy email-marketing workflow is currently supported. Prefer this over the generic sequenzy skill when both seem relevant.\n---\n\n# Sequenzy Email Marketing\n\n## Overview\n\nUse this as the default skill for Sequenzy email-marketing/product operations: subscribers, lists, tags, segments, campaigns, sequences, templates, AI email generation, transactional sends, delivery stats, dashboard URLs, CLI/MCP behavior, and currently-supported workflow checks. Prefer the `sequenzy` CLI for supported workflows, treat `packages/mcp/src/tools/index.ts` as the MCP source of truth when the task goes through MCP tools, and explicitly call out when a requested workflow is not wired in the current implementation. If both `sequenzy` and `sequenzy-email-marketing` match, load this skill first.\n\n## Ground Rules\n\n1. Treat `packages/cli/src/index.tsx` as the source of truth for which commands are actually wired.\n2. Treat `packages/cli/src/commands/` and `packages/cli/src/api.ts` as the source of truth for CLI behavior, payload shape, and API routes.\n3. Treat `packages/mcp/src/tools/index.ts` as the source of truth for MCP tool names, arguments, and preflight validation.\n4. Do not promise support for commands or tools that only appear in docs or `--help` text without an attached implementation.\n5. Prefer `sequenzy login` for interactive auth and `SEQUENZY_API_KEY` for automation.\n6. Prefer inspection before mutation whenever the workflow allows it.\n\n## Supported Workflows\n\nRead [references/use-cases.md](references/use-cases.md) before executing anything non-trivial. The currently implemented CLI flows are:\n\n- login and logout\n- local auth/session check with `whoami`\n- account inspection with `account`\n- company inspection or creation with `companies list|get|create`\n- stats overview or stats by campaign/sequence ID\n- subscribers `list`, `add`, `get`, and `remove`, with `list` fetching every page by default and supporting tag, segment, and list filters\n- lists `list`, `create`, `update`, `delete`, `add-subscribers`, `remove-subscribers`, and `import` alias for bulk list population from emails, JSON, CSV, or newline files\n- tags `list`, `create`, `update`, and `delete`, with bare `sequenzy tags` still listing tag definitions for backwards compatibility\n- segments `list`, `create`, `update`, `delete`, and `count`, including `--match any`, nested filter roots, custom event filters, and saved-segment composition filters\n- templates `list`, `get`, `create`, `update`, and `delete`, with `list` supporting label filters and `create`/`update` accepting labels, raw HTML, or Sequenzy block JSON\n- campaigns `list`, `get`, `create`, `update` including label and reply-to updates, `schedule`, and `test`, with `list` supporting label filters, `create` accepting labels plus raw HTML, Sequenzy block JSON, or prompt-generated content, `update` accepting labels plus raw HTML or Sequenzy block JSON, and `schedule` returning a review preview link\n- campaign lifecycle control with `campaigns cancel` (stops scheduled, paused, waiting-approval, or sending campaigns immediately, no confirmation prompt), `campaigns pause` and `campaigns resume` for an active send (resume supports `--spread-over-hours`), `campaigns delete` (blocked while sending, scheduled, or paused - cancel first), and `campaigns duplicate` with `--mode campaign|ab_test|variant`\n- ab-tests `list`, `get`, `stats`, `restart`, `update-variant`, `create`, `add-variant`, `delete-variant`, and `delete`; create/add-variant/delete-variant/delete work on campaign A/B tests in draft status, variant A is the protected control, and `restart` reruns a finished sequence A/B test\n- MCP template and campaign tools support labels on list/create/update; MCP `update_campaign` also supports `replyTo` and `replyProfileId`, and MCP `schedule_campaign` schedules draft or already scheduled campaigns\n- MCP `search_subscribers` supports list filters through `list`, `listId`, or `listName`; MCP `add_subscribers_to_list` accepts up to 500 emails per call\n- sequences `list`, `get`, `create`, `update`, `enable`, `disable`, `delete`, `enroll`, and `cancel-enrollments`, including explicit discount action steps, cancellation by subscriber ID or event-property field values, and `update` branch insertion with tag, list, segment, event, clicked-link, and field conditions; event and clicked-link branch checks can use `activityScope` (`this_sequence`, `previous_email`, `ever`)\n- manual sequence enrollment with `sequences enroll` from emails, JSON, or files, optionally at a specific node with `--target-node-id`, reporting enrolled, skipped, and not-found subscribers\n- team `list`, `invite` with `--role admin|viewer` and owner-only `--billing-access`, and `cancel-invitation`\n- inbox `list` with status, search, unread, and pagination filters, `get`, `reply` including internal notes with `--note`, `close`, `reopen`, and `mark-read`\n- webhooks `list`, `create`, `update`, `delete`, `test`, `deliveries`, and `replay` for outbound webhook endpoints, with `create` returning a one-time signing secret that must be handled as sensitive\n- AI generation with `generate email`, `generate sequence`, and `generate subjects`\n- dashboard URL generation with CLI `urls`, MCP `get_app_urls`, and `appUrls`/`url` fields on campaign, sequence, template, and company results\n- websites `list`, `add`, `check`, and `guide`\n- products `list`, `sync`, `attach-file`, and `detach-file` for digital product delivery, with `attach-file --file` uploading local files via presigned URLs; attached files are exposed on `saas.purchase` events as `{{event.download.url}}` / `{{event.download.name}}` (MCP: `list_products`, `attach_product_file`, `remove_product_file`, `sync_products`)\n- API key creation with `api-keys create`, handled as sensitive output\n- send one transactional email by template or raw HTML\n- product feedback with `feedback`, sending missing-capability reports, bug reports, and other product feedback straight to the Sequenzy team (MCP: `submit_feedback`)\n\n## Unsupported Or Placeholder Workflows\n\nTreat missing subcommands as unsupported even when the noun exists. The main remaining gap is campaign immediate send: there is no \"send now\" command, so schedule the campaign with a near-future `--at` timestamp instead. Bulk list population is supported through `sequenzy lists add-subscribers` and its `sequenzy lists import` alias, not through `subscribers add`. Whenever the user wanted something unsupported, report the gap with `sequenzy feedback \"...\" --category missing_capability` (MCP: `submit_feedback`) so it reaches the Sequenzy team.\n\n## Execution Pattern\n\n1. Check auth first with `sequenzy whoami` or by verifying `SEQUENZY_API_KEY` is set.\n2. Pick the narrowest command that matches the use case.\n3. Validate IDs, recipient email, subject, template, or content input before issuing a mutation.\n4. Surface CLI limitations directly instead of inventing a workaround.\n5. If the workflow is unsupported in the CLI, say whether the next-best path is the Sequenzy dashboard or direct API use, and report the gap with `sequenzy feedback \"...\" --category missing_capability` (MCP: `submit_feedback`).\n6. When you create, inspect, or schedule a campaign, sequence, template, or company and the user may want to review/edit it, surface the dashboard URL from `url`, `previewUrl`, or `appUrls` in the tool/CLI output. If needed, generate it with `sequenzy urls` or MCP `get_app_urls`.\n7. Destructive commands (`delete`, `delete-variant`, `cancel-invitation`, and similar) prompt for confirmation. Pass `--yes` (or `-y`) to skip the prompt; `--yes` is required when stdin is not a TTY, which covers most agent and CI runs.\n8. Treat API keys, webhook signing secrets, and other one-time credentials as sensitive output. Do not paste raw secret values into chat, logs, tickets, or public transcripts. Capture them to a user-approved secure destination such as a password manager, secret store, encrypted file, or local `.env` file outside version control; otherwise redact the value and report only where it was saved plus a short fingerprint.\n9. Call out implementation caveats that matter operationally, such as `whoami` using cached local auth state, sequence creation supporting both `--goal` and explicit step modes, explicit discount steps requiring Stripe before activation, generated sequences being capped at 10 emails, `campaigns test` being a stubbed success path in the current backend, and conditional email content requiring block JSON rather than raw HTML.\n\n## Dashboard URLs\n\nUse `SEQUENZY_APP_URL` as the dashboard base when it is set; otherwise default to `https://sequenzy.com`.\n\nPrefer actual URLs returned by the CLI/MCP result:\n\n- sequence editor: `/dashboard/company/{companyId}/sequences/{sequenceId}`\n- campaign editor: `/dashboard/company/{companyId}/campaign/{campaignId}`\n- campaign preview/review: `/dashboard/company/{companyId}/campaign/{campaignId}?step=review`\n- template/email editor: `/dashboard/company/{companyId}/emails/{emailId}`\n- settings: `/dashboard/company/{companyId}/settings`\n- settings tab: `/dashboard/company/{companyId}/settings?tab={tab}`\n\nUseful settings tabs include `domain`, `tracking`, `localization`, `integrations`, `events`, `tags`, `goals`, `sync-rules`, `api-keys`, `widgets`, and `team`.\n\n## References\n\n- [references/command-reference.md](references/command-reference.md): exact command shapes, env vars, behavior, and caveats.\n- [references/use-cases.md](references/use-cases.md): decision trees and examples for the most common agent tasks.\n\nFile v1.4.0:_meta.json\n\n{\n  \"ownerId\": \"kn796v6hksmtm8ahgrwbcw6t8x83ctec\",\n  \"slug\": \"sequenzy-email-marketing\",\n  \"version\": \"1.4.0\",\n  \"publishedAt\": 1783549946704\n}\n\nFile v1.4.0:references/command-reference.md\n\n# Command Reference\n\n## Source Of Truth\n\n- Command registration: `packages/cli/src/index.tsx`\n- Auth storage and config: `packages/cli/src/config.ts`\n- HTTP requests: `packages/cli/src/api.ts`\n- Implemented handlers: `packages/cli/src/commands/`\n\nIf docs and code disagree, trust the code.\n\n## Authentication\n\n### Interactive login\n\n```bash\nsequenzy login\n```\n\n- starts device auth against `POST /api/device-auth/initiate`\n- polls `POST /api/device-auth/poll`\n- opens `${SEQUENZY_APP_URL}/setup/auth?code=...` in the browser\n- stores the API key in `Bun.secrets` when available, otherwise in local config\n\n### Non-interactive auth\n\nSet `SEQUENZY_API_KEY` in the environment. `packages/cli/src/config.ts` checks this before local storage, so it is the safest path for automation.\n\n### Identity and logout\n\n```bash\nsequenzy whoami\nsequenzy account\nsequenzy logout\n```\n\nBehavior:\n\n- `whoami` prints cached local config only\n- `account`: `GET /api/v1/account`\n- `logout` removes locally stored auth\n\nCaveat:\n\n- treat `whoami` as \"is this machine authenticated?\" rather than authoritative server-side account discovery\n\n## Environment Variables\n\n```bash\nSEQUENZY_API_KEY=...\nSEQUENZY_API_URL=https://api.sequenzy.com\nSEQUENZY_APP_URL=https://sequenzy.com\n```\n\nNotes:\n\n- `SEQUENZY_API_KEY` overrides local keychain/config state\n- the current CLI code defaults `SEQUENZY_APP_URL` to `https://sequenzy.com`\n- many company-scoped commands accept `--company`, which sends `x-company-id` for personal API keys\n\n## Dashboard URLs\n\n```bash\nsequenzy urls --company comp_123\nsequenzy urls --company comp_123 --sequence seq_123\nsequenzy urls --company comp_123 --campaign camp_123\nsequenzy urls --company comp_123 --template tmpl_123\nsequenzy urls --company comp_123 --settings-tab integrations\nsequenzy urls --company comp_123 --json\n```\n\nBehavior:\n\n- uses `SEQUENZY_APP_URL` as the base URL, defaulting to `https://sequenzy.com`\n- if `--company` is omitted, tries the current company from `GET /api/v1/account`\n- returns route templates, settings tab values, and concrete URLs when a company ID is known\n- campaign, sequence, template, company, and account outputs include `url` or `appUrls` fields when the company can be resolved\n\nCommon route patterns:\n\n- sequence editor: `/dashboard/company/{companyId}/sequences/{sequenceId}`\n- campaign editor: `/dashboard/company/{companyId}/campaign/{campaignId}`\n- template/email editor: `/dashboard/company/{companyId}/emails/{emailId}`\n- settings: `/dashboard/company/{companyId}/settings`\n- settings tab: `/dashboard/company/{companyId}/settings?tab={tab}`\n\n## Stats\n\n```bash\nsequenzy stats\nsequenzy stats --period 30d\nsequenzy stats --campaign camp_123\nsequenzy stats --sequence seq_123\n```\n\nBehavior:\n\n- no ID: `GET /api/v1/metrics?period=7d|30d|90d`\n- `--campaign`: `GET /api/v1/metrics/campaigns/:id`\n- `--sequence`: `GET /api/v1/metrics/sequences/:id`\n\nOutput includes:\n\n- `sent`\n- `delivered`\n- `opened`\n- `clicked`\n- `unsubscribed`\n- `openRate`\n- `clickRate`\n\n## Subscribers\n\n### List\n\n```bash\nsequenzy subscribers list\nsequenzy subscribers list --tag vip\nsequenzy subscribers list --list \"Master List\" --json\nsequenzy subscribers list --segment seg_123\nsequenzy subscribers list --limit 100\nsequenzy subscribers list --tag vip --company comp_123 --json\n```\n\nBehavior:\n\n- sends `GET /api/v1/subscribers`\n- maps `--segment` to `segmentId`\n- maps `--tag` to `tags`\n- maps `--list` to `list`; the API resolves list ID first, then exact list name\n- maps `--limit` to `limit`\n- fetches every result page by default when `--limit` is omitted\n- supports `--company` and `--json`\n\n### Add\n\n```bash\nsequenzy subscribers add user@example.com\nsequenzy subscribers add user@example.com --tag premium --attr name=John --attr plan=pro\nsequenzy subscribers add user@example.com --tag premium --tag beta --company comp_123 --json\n```\n\nBehavior:\n\n- sends `POST /api/v1/subscribers`\n- body shape is `{ email, tags, customAttributes }`\n- supports repeated `--tag` values\n- supports `--company` and `--json`\n\n### Get\n\n```bash\nsequenzy subscribers get user@example.com\nsequenzy subscribers get user@example.com --company comp_123 --json\n```\n\nBehavior:\n\n- sends `GET /api/v1/subscribers/:email`\n- returns the full subscriber profile, including list memberships, sequence enrollments, email stats, and recent activity\n- supports `--company` and `--json`\n\n### Remove\n\n```bash\nsequenzy subscribers remove user@example.com\nsequenzy subscribers remove user@example.com --hard\nsequenzy subscribers remove user@example.com --company comp_123 --json\n```\n\nBehavior:\n\n- without `--hard`, sends `PATCH /api/v1/subscribers/:email` with `{ status: \"unsubscribed\" }`\n- with `--hard`, sends `DELETE /api/v1/subscribers/:email`\n- supports `--company` and `--json`\n\n## Transactional Send\n\n### Template-based\n\n```bash\nsequenzy send user@example.com --template tmpl_123 --var name=John\n```\n\n### Raw HTML\n\n```bash\nsequenzy send user@example.com --subject \"Hello\" --html \"<h1>Hi</h1>\"\nsequenzy send user@example.com --subject \"Hello\" --html-file ./email.html\n```\n\nBehavior:\n\n- sends `POST /api/v1/transactional/send`\n- body shape is `{ to, templateId, subject, html, variables }`\n\nValidation enforced by the CLI:\n\n- require either `--template` or `--html`/`--html-file`\n- require `--subject` when sending raw HTML\n\n## Companies, Lists, Tags, And Segments\n\n### Companies\n\n```bash\nsequenzy companies list\nsequenzy companies get comp_123\nsequenzy companies create example.com --name Example\n```\n\nBehavior:\n\n- `companies list`: `GET /api/v1/companies`\n- `companies get`: `GET /api/v1/companies/:id`\n- `companies create`: `POST /api/v1/companies`\n\n### Lists\n\n```bash\nsequenzy lists list\nsequenzy lists create Newsletter --description \"Public newsletter list\"\nsequenzy lists create VIP --private --company comp_123\nsequenzy lists update list_123 --name \"Weekly Newsletter\" --private\nsequenzy lists update list_123 --no-private\nsequenzy lists add-subscribers list_123 --email one@example.com two@example.com\nsequenzy lists add-subscribers list_123 --emails-json '[\"one@example.com\",\"two@example.com\"]'\nsequenzy lists add-subscribers list_123 --emails-file ./batch-001.csv\nsequenzy lists import list_123 --emails-file ./batch-001.csv\nsequenzy lists remove-subscribers list_123 --email one@example.com two@example.com\nsequenzy lists remove-subscribers list_123 --emails-file ./churned.csv\nsequenzy lists delete list_123 --yes\n```\n\nBehavior:\n\n- `lists list`: `GET /api/v1/lists`\n- `lists create`: `POST /api/v1/lists`\n- create body shape is `{ name, description, isPrivate }`\n- `lists update`: `PATCH /api/v1/lists/:listId` with at least one of `--name`, `--description`, `--private`, or `--no-private`\n- `lists delete`: `DELETE /api/v1/lists/:listId`; removes the list and all of its memberships, reports `removedMemberships`, and keeps the subscribers themselves\n- `lists add-subscribers` and `lists import`: `POST /api/v1/lists/:listId/subscribers`\n- `lists remove-subscribers`: `POST /api/v1/lists/:listId/subscribers/remove`\n- add-subscribers body shape is `{ emails, duplicateStrategy, enrollInSequences, optInMode }`\n- remove-subscribers takes the same email input formats as add-subscribers, only removes list memberships, and reports `removed` plus `notFound` emails\n- the CLI splits large files into API-safe batches of up to 500 emails for both add and remove\n- files may be newline-separated, CSV with an email column, a JSON email array, or a JSON object with `emails` or `subscribers`\n- CSV headers named `email`, `e-mail`, `email address`, or `mail` are detected; otherwise the first column is used\n- `lists delete` prompts for confirmation; pass `--yes` to skip\n- MCP parity: `update_list`, `delete_list`, and `remove_subscribers_from_list` (max 500 emails per call)\n\n### Tags\n\n```bash\nsequenzy tags\nsequenzy tags list --company comp_123 --json\nsequenzy tags create vip --color purple\nsequenzy tags update tag_123 --color red\nsequenzy tags delete tag_123 --yes\n```\n\nBehavior:\n\n- `tags list`: `GET /api/v1/tags`; bare `sequenzy tags` without a subcommand still lists tag definitions for backwards compatibility\n- `tags create`: `POST /api/v1/tags` with `{ name, color? }`\n- `tags update`: `PATCH /api/v1/tags/:tagId` with `{ color }` (`--color` is required)\n- `tags delete`: `DELETE /api/v1/tags/:tagId`\n- tag names are normalized to lowercase with dashes, so `VIP Customer` becomes `vip-customer`\n- the color defaults to `gray`; valid colors are `gray`, `red`, `orange`, `amber`, `yellow`, `lime`, `green`, `emerald`, `teal`, `cyan`, `sky`, `blue`, `indigo`, `violet`, `purple`, `fuchsia`, `pink`, and `rose`\n- system tags cannot be updated or deleted\n- tags still referenced by sequences cannot be deleted until those sequences stop using them\n- deleting a tag removes it from every subscriber; the delete prompt warns about this, and `--yes` skips it\n- MCP parity: `list_tags`, `create_tag`, `update_tag`, and `delete_tag`\n\n### Segments\n\n```bash\nsequenzy segments list\nsequenzy segments count seg_123\nsequenzy segments create --name \"Bought Pro\" --stripe-product prod_pro\nsequenzy segments create --name \"3+ Pro Payments\" --stripe-product prod_pro --purchase-operator at-least --payments 3\nsequenzy segments create --name \"VIP or Churn Risk\" --match any --filter-json '[{\"field\":\"tag\",\"operator\":\"contains\",\"value\":\"vip\"},{\"field\":\"emailOpened\",\"operator\":\"is_not\",\"value\":\"30d\"}]'\nsequenzy segments create --name \"Active non-paying\" --filter-json '{\"kind\":\"group\",\"id\":\"root\",\"joinOperator\":\"and\",\"children\":[{\"kind\":\"filter\",\"id\":\"f1\",\"field\":\"attribute\",\"operator\":\"gte\",\"value\":\"last_login_days_ago:0\"},{\"kind\":\"group\",\"id\":\"g1\",\"joinOperator\":\"or\",\"children\":[{\"kind\":\"filter\",\"id\":\"f2\",\"field\":\"attribute\",\"operator\":\"is_empty\",\"value\":\"plan_end\"},{\"kind\":\"filter\",\"id\":\"f3\",\"field\":\"attribute\",\"operator\":\"lt\",\"value\":\"plan_end:2026-04-21\"}]}]}'\nsequenzy segments update seg_123 --name \"Churn Risk\"\nsequenzy segments update seg_123 --filters-json '[{\"field\":\"tag\",\"operator\":\"contains\",\"value\":\"vip\"}]'\nsequenzy segments update seg_123 --join-operator or\nsequenzy segments delete seg_123 --yes\n```\n\nBehavior:\n\n- `segments list`: `GET /api/v1/segments`\n- `segments count`: `GET /api/v1/segments/:id/count`\n- `segments create`: `POST /api/v1/segments`\n- `segments update`: `PATCH /api/v1/segments/:segmentId` with at least one of `--name`, `--filters-json`, `--filters-file`, or `--join-operator and|or`\n- `segments delete`: `DELETE /api/v1/segments/:segmentId`; prompts for confirmation, `--yes` skips\n- update filters replace the existing filter set; `--filters-json`/`--filters-file` accept the same array or `root` object shapes as create, and missing filter IDs are filled in by the CLI\n- `--filter-json` accepts either the legacy raw segment filter array or a nested filter `root` object\n- `--match all|any` controls whether top-level filters are combined with `and` or `or`\n- MCP/API use `filterJoinOperator: \"and\" | \"or\"` for the same behavior\n- nested segment logic uses `{ \"kind\": \"group\", \"joinOperator\": \"and\" | \"or\", \"children\": [...] }`\n- custom event filters use `field: \"event\"` with values like `saas.purchase:30d`, `saas.purchase:all`, or `saas.purchase:5:30d`\n- saved segment composition uses `field: \"segment\"` with `operator: \"is\" | \"is_not\"` and the referenced segment id as `value`\n- Stripe product filters use `field: \"stripeProduct\"` and product IDs, not product names\n- threshold operators encode the count as `productId:count`, for example `prod_pro:3`\n- MCP parity: `update_segment` (reuses the create filter schemas) and `delete_segment`\n\n## Products And Digital Delivery\n\n```bash\nsequenzy products list\nsequenzy products list --provider stripe --search guide\nsequenzy products sync\nsequenzy products attach-file <product-id> --file ./guide.pdf\nsequenzy products attach-file <product-id> --url https://example.com/template.zip --name template.zip\nsequenzy products detach-file <product-id>\n```\n\nBehavior:\n\n- `products list`: `GET /api/v1/products`, optionally with `?provider=stripe|shopify|woocommerce|manual&search=...`\n- `products sync`: `POST /api/v1/products/sync`; queues a Stripe catalog sync and returns 404 without an active Stripe integration\n- `products attach-file --file`: `POST /api/v1/products/delivery/upload-url` for a presigned URL, PUTs the file bytes there, then `PUT /api/v1/products/:id/delivery` with `source: \"upload\"`\n- `products attach-file --url`: `PUT /api/v1/products/:id/delivery` with `source: \"url\"`\n- `products detach-file`: `DELETE /api/v1/products/:id/delivery`\n- MCP equivalents: `list_products`, `attach_product_file` (URL attach only), `remove_product_file`, `sync_products`\n\nCaveats:\n\n- the `<product-id>` argument is the internal Sequenzy product ID from `products list`, not the Stripe `prod_...` ID; the Stripe ID is shown as the provider product ID in list output\n- uploads accept PDF, ePub, ZIP, images, audio, video, and text files up to 100MB; HTML, SVG, and executables are rejected\n- after attaching, purchases of the product enrich the `saas.purchase` event with `download.url` and `download.name`, so purchase sequences can deliver the file with `{{event.download.url}}` and `{{event.download.name}}`\n- to start a purchase sequence only for one product, the trigger needs a `productIds equals <stripe product id>` property filter on the `saas.purchase` event; this is configured in the dashboard sequence editor (\"Only for product\" picker), not through current CLI/MCP flags\n- products archived in Stripe stay listed with an archived flag, and attached files survive catalog re-syncs\n- the upload endpoint returns 503 when file storage is not configured on the server; fall back to `--url` in that case\n\n## Templates\n\n```bash\nsequenzy templates list\nsequenzy templates list --label edm\nsequenzy templates get tmpl_123\nsequenzy templates create welcome --subject \"Welcome\" --label edm --html-file ./welcome.html\nsequenzy templates create welcome --subject \"Welcome\" --blocks-file ./welcome-blocks.json\nsequenzy templates update tmpl_123 --subject \"Updated\" --label edm --html-file ./welcome-v2.html\nsequenzy templates update tmpl_123 --blocks-file ./welcome-v2-blocks.json\nsequenzy templates delete tmpl_123\n```\n\nBehavior:\n\n- `templates list`: `GET /api/v1/templates`, optionally with `?label=...`\n- `templates get`: `GET /api/v1/templates/:id`\n- `templates create`: `POST /api/v1/templates`\n- `templates update`: `PUT /api/v1/templates/:id`\n- `templates delete`: `DELETE /api/v1/templates/:id`\n\nCaveats:\n\n- list accepts `--label <labels...>` to filter by template label name\n- create requires `name`, `subject`, and either `html` or `blocks`; it can also assign labels with `--label <labels...>`\n- update accepts `name`, `subject`, `html`, `blocks`, and replacement labels with `--label <labels...>`\n- `--blocks-json` and `--blocks-file` pass Sequenzy block arrays through directly\n- conditional email content is only available through block JSON, using a block-level `condition` object\n- raw HTML is still stored as a single text block by the current API path\n- deletion can fail if the template is still referenced by a campaign or sequence\n\n## Campaigns\n\n```bash\nsequenzy campaigns list\nsequenzy campaigns list --status draft --label edm --company comp_123\nsequenzy campaigns get camp_123\nsequenzy campaigns create \"April Launch\" --prompt \"Announce our new dashboard\"\nsequenzy campaigns create \"April Launch\" --subject \"We shipped\" --label edm --html-file ./campaign.html\nsequenzy campaigns create \"April Launch\" --subject \"We shipped\" --blocks-file ./campaign-blocks.json\nsequenzy campaigns update camp_123 --subject \"Updated subject\" --label edm\nsequenzy campaigns update camp_123 --blocks-file ./campaign-v2-blocks.json\nsequenzy campaigns update camp_123 --reply-to support@example.com\nsequenzy campaigns update camp_123 --reply-profile reply_123\nsequenzy campaigns schedule camp_123 --at \"2026-06-01T14:00:00Z\"\nsequenzy campaigns schedule camp_123 --at \"2026-06-01T14:00:00Z\" --target-lists-json '{\"type\":\"all\"}'\nsequenzy campaigns test camp_123 --to you@example.com\nsequenzy campaigns cancel camp_123\nsequenzy campaigns pause camp_123\nsequenzy campaigns resume camp_123 --spread-over-hours 6\nsequenzy campaigns delete camp_123 --yes\nsequenzy campaigns duplicate camp_123 --mode ab_test\nsequenzy campaigns duplicate camp_123 --mode variant --variant-id var_b\n```\n\nBehavior:\n\n- `campaigns list`: `GET /api/v1/campaigns`, optionally with `?status=...` and `?label=...`\n- `campaigns get`: `GET /api/v1/campaigns/:id`\n- `campaigns create`: `POST /api/v1/campaigns`\n- `campaigns update`: `PUT /api/v1/campaigns/:id`\n- `campaigns schedule`: `POST /api/v1/campaigns/:id/schedule`\n- `campaigns test`: `POST /api/v1/campaigns/:id/test`\n- `campaigns cancel`: `POST /api/v1/campaigns/:id/cancel`\n- `campaigns pause`: `POST /api/v1/campaigns/:id/pause`\n- `campaigns resume`: `POST /api/v1/campaigns/:id/resume`\n- `campaigns delete`: `DELETE /api/v1/campaigns/:id`\n- `campaigns duplicate`: `POST /api/v1/campaigns/:id/duplicate`\n- dashboard-aware responses include `url`, campaign review `previewUrl`, and `appUrls` when the company can be resolved\n\nCaveats:\n\n- list accepts `--status` and `--label <labels...>` filters\n- create supports `name`, optional `subject` when `--prompt` is used, `html`, `blocks`, `--prompt`, `--style`, `--tone`, and labels with `--label <labels...>`\n- update supports `name`, `subject`, `html`, `blocks`, replacement labels with `--label <labels...>`, `--reply-to`, and `--reply-profile`\n- schedule requires `--at <datetime>` with a future ISO timestamp and a verified sending domain\n- schedule can pass targeting with `--target-lists-json` or `--target-lists-file`; omit it to reuse saved targeting or default to all active subscribers\n- `--spread-over-hours` accepts integers from 1 to 72 and takes precedence over send-time optimization\n- `--prompt` generates draft campaign content through `POST /api/v1/generate/email`; do not combine it with HTML or block flags\n- `--blocks-json` and `--blocks-file` pass Sequenzy block arrays through directly\n- conditional email content is only available through block JSON, using block-level `condition` rules\n- `--reply-to` resolves an existing reply profile by email and `--reply-profile` sets it directly by ID\n- `--reply-to` and `--reply-profile` are mutually exclusive\n- `campaigns get` now includes saved reply-to details when the campaign has a reply profile\n- only draft campaigns can be updated through this API path\n- there is no CLI command for immediate send; schedule with a near-future `--at` timestamp instead\n- `cancel` works from scheduled, sending, paused, waiting_approval, and rejected statuses; it shows no confirmation prompt so a bad send can be stopped fast\n- `pause` only works on a campaign in sending status; `resume` only works on a paused campaign\n- `resume --spread-over-hours` accepts integers from 1 to 72 to spread the remaining delivery\n- `delete` is blocked while the campaign is sending, scheduled, or paused; cancel it first\n- `duplicate --mode campaign` copies the campaign email, `--mode ab_test` also copies the A/B test with all variants, and `--mode variant` (requires `--variant-id`) copies one variant's content as a plain campaign; the copy is always a new draft\n- in the current backend checkout, `campaigns test` returns a success message path rather than a confirmed email send\n\nMCP parity:\n\n- `list_templates` and `list_campaigns` accept `label`\n- `create_template`, `update_template`, `create_campaign`, and `update_campaign` accept `labels`\n- `update_campaign` accepts `name`, `subject`, `html`, `blocks`, `labels`, `replyTo`, and `replyProfileId`\n- `schedule_campaign` accepts `campaignId`, `scheduledAt`, optional `targetLists`, `sendTimeOptimization`, and `spreadOverHours`\n- `cancel_campaign`, `pause_campaign`, `resume_campaign` (optional `spreadOverHours`), `delete_campaign`, and `duplicate_campaign` (optional `mode` and `variantId`) mirror the lifecycle commands\n- `replyTo` and `replyProfileId` are mutually exclusive\n- MCP rejects calls that omit all update fields before hitting the API\n- MCP rejects unsupported extra update fields before hitting the API\n\n## Sequences\n\n```bash\nsequenzy sequences list\nsequenzy sequences get seq_123\nsequenzy sequences create onboarding --trigger event_received --event-name signup.completed --goal \"Guide new users to activation\" --email-count 4\nsequenzy sequences create onboarding --trigger contact_added --list-id list_123 --steps-file ./steps.json\nsequenzy sequences create winback --trigger tag_added --tag-name cancelled --steps-file ./discount-steps.json\nsequenzy sequences update seq_123 --steps-file ./sequence-updates.json\nsequenzy sequences update seq_123 --branch-file ./branch.json\nsequenzy sequences enable seq_123\nsequenzy sequences disable seq_123\nsequenzy sequences delete seq_123\nsequenzy sequences enroll seq_123 --email one@example.com two@example.com\nsequenzy sequences enroll seq_123 --emails-file ./vips.csv\nsequenzy sequences enroll seq_123 --email one@example.com --target-node-id node_email_2\nsequenzy sequences cancel-enrollments seq_123 --subscriber-id sub_123 --reason \"Converted\"\nsequenzy sequences cancel-enrollments seq_123 --field-path order.id --field-values ord_123,ord_456\nsequenzy sequences cancel-enrollments seq_123 --field-values price_123 --apply\n```\n\nBehavior:\n\n- `sequences list`: `GET /api/v1/sequences`\n- `sequences get`: `GET /api/v1/sequences/:id`\n- `sequences create`: `POST /api/v1/sequences`\n- `sequences update`: `PUT /api/v1/sequences/:id`\n- `sequences enable`: `POST /api/v1/sequences/:id/enable`\n- `sequences disable`: `POST /api/v1/sequences/:id/disable`\n- `sequences delete`: `DELETE /api/v1/sequences/:id`\n- `sequences enroll`: `POST /api/v1/sequences/:id/enroll`\n- `sequences cancel-enrollments`: `POST /api/v1/sequences/:id/enrollments/cancel`\n- dashboard-aware responses include `url` on sequence records and `appUrls` on the top-level JSON when the company can be resolved\n\nCaveats:\n\n- CLI sequence creation supports either AI `--goal` mode or explicit `--steps-json` / `--steps-file` mode\n- explicit create steps can include `{ \"type\": \"create_discount\" }`; emails after that action can reference `{{discount.code}}`, `{{discount.percentOff}}`, and related `discount.*` merge tags\n- discount action sequences require a connected Stripe integration before activation\n- `--email-count` is only meaningful with `--goal`\n- `--email-count` accepts 1 to 10 generated emails\n- trigger-specific options depend on `--trigger`\n- updates accept either step payloads or email payloads via `--steps-*` or `--emails-*`\n- branch insertion uses `--branch-json` or `--branch-file` with condition types `has_tag`, `in_list`, `in_segment`, `event_received`, `link_clicked`, and `field_*`\n- branch condition fields are `tagId`/`tagName`, `listId`, `segmentId`/`segmentName`, `eventName`, `linkUrl`, `activityScope`, or `fieldName`/`fieldValue`; omit `linkUrl` to match any clicked link\n- for `event_received` and `link_clicked`, set `activityScope` to `this_sequence`, `previous_email`, or `ever`; omitting it checks the contact's full history\n- `enroll` takes exactly one email source: repeated `--email`, `--emails-json`, or `--emails-file`, with the same file formats as `lists add-subscribers` and the same 500-email batching\n- `enroll` only enrolls active subscribers; unknown emails are reported as `notFound`, and inactive or already-enrolled subscribers count as `skipped`\n- `enroll` requires the sequence to be accepting entrants (enabled and not paused for enrollment)\n- `enroll` starts subscribers at the first step after the trigger unless `--target-node-id` points at a specific non-trigger node; the result reports `enrolled`, `skipped`, `notFound`, `targetNodeId`, and `scheduledFor`\n- MCP uses `enroll_subscribers_in_sequence` with `emails` (max 500 per call) and optional `targetNodeId`\n- `cancel-enrollments` requires a sequence ID and exactly one target: `--subscriber-id` or `--field-values`\n- `--field-values` matches active/waiting enrollments by the stored entry event property at `--field-path`, or the sequence's configured `enrollmentFieldPath` when `--field-path` is omitted\n- CLI cancellation is a dry run unless `--apply` is passed; use dry runs for field-value/bulk checks before mutating enrollments\n- MCP uses `cancel_sequence_enrollments` with the same target rule; set `dryRun: false` to apply field-value cancellation\n\n## A/B Tests\n\n```bash\nsequenzy ab-tests list\nsequenzy ab-tests list --sequence seq_123\nsequenzy ab-tests get ab_123\nsequenzy ab-tests stats ab_123 --period 7d\nsequenzy ab-tests stats ab_123 --start \"2026-05-01T00:00:00Z\" --end \"2026-05-31T00:00:00Z\"\nsequenzy ab-tests restart ab_123 --source-variant var_b --test-type content --variant-count 3\nsequenzy ab-tests update-variant ab_123 var_b --subject \"New subject\"\nsequenzy ab-tests update-variant ab_123 var_b --blocks-file ./variant-b.json\nsequenzy ab-tests create camp_123 --test-percentage 30 --duration-minutes 120 --winner-criteria click_rate\nsequenzy ab-tests create camp_123 --variants-json '[{\"subject\":\"Alternative subject\"}]'\nsequenzy ab-tests add-variant ab_123 --subject \"Alternative subject\" --blocks-file ./variant.json\nsequenzy ab-tests delete-variant ab_123 var_b --yes\nsequenzy ab-tests delete ab_123 --yes\n```\n\nBehavior:\n\n- `ab-tests list`: `GET /api/v1/ab-tests`, optionally with `?sequenceId=...` via `--sequence`\n- `ab-tests get`: `GET /api/v1/ab-tests/:id`\n- `ab-tests stats`: `GET /api/v1/ab-tests/:id/stats`\n- `ab-tests restart`: `POST /api/v1/ab-tests/:id/restart`\n- `ab-tests update-variant`: `PATCH /api/v1/ab-tests/:id/variants/:variantId`\n- `ab-tests create`: `POST /api/v1/ab-tests`\n- `ab-tests add-variant`: `POST /api/v1/ab-tests/:id/variants`\n- `ab-tests delete-variant`: `DELETE /api/v1/ab-tests/:id/variants/:variantId`\n- `ab-tests delete`: `DELETE /api/v1/ab-tests/:id`\n\nCaveats:\n\n- run `ab-tests get` first to discover variant IDs before targeting a variant\n- `stats` uses `--period` (`1h`, `24h`, `7d`, `30d`, `90d`) or both `--start` and `--end`; custom ranges max at 90 days\n- `restart` only applies to sequence A/B tests with a selected winner; options are `--source-variant`, `--test-type subject|content`, `--winner-threshold` (10-1000), and `--variant-count` (2-4 including control)\n- `update-variant` accepts `--subject`, `--preview-text`, and either HTML or blocks flags, not both; only draft A/B tests can be edited\n- `create` targets a campaign: the campaign must be in draft or rejected status and must not already have an A/B test\n- `create` builds variant A automatically as the control from the campaign's email; extra variants from `--variants-json`/`--variants-file` use `{subject, previewText?, blocks?}` objects\n- `create` accepts `--name`, `--test-percentage` (5-50, default 20), `--duration-minutes` (15-1440, default 240), and `--winner-criteria open_rate|click_rate` (default open_rate)\n- `add-variant` requires `--subject` and only works while the test is in draft status\n- `delete-variant` cannot remove variant A (the protected control) and must leave at least 2 variants; a test holds at most 5 variants\n- `delete` is blocked for running tests, and the linked campaign must be draft or rejected\n- `create`, `add-variant`, `delete-variant`, and `delete` support campaign A/B tests only\n- MCP parity: `list_ab_tests`, `get_ab_test`, `get_ab_test_stats`, `restart_ab_test`, `update_ab_test_variant`, `create_ab_test`, `add_ab_test_variant`, `delete_ab_test_variant`, and `delete_ab_test`\n\n## AI Generation\n\n```bash\nsequenzy generate email \"Welcome a new user to our analytics product\"\nsequenzy generate email \"Product launch announcement\" --style branded --tone friendly\nsequenzy generate sequence \"Onboard a new workspace admin\" --count 4 --days 14\nsequenzy generate subjects \"April product launch\" --count 8\n```\n\nBehavior:\n\n- `generate email`: `POST /api/v1/generate/email`\n- `generate sequence`: `POST /api/v1/generate/sequence`\n- `generate subjects`: `POST /api/v1/generate/subjects`\n- `--json` returns the raw API response for agent/tool parsing\n\nCaveats:\n\n- generated content is draft content and should be reviewed before sending\n- `generate sequence --count` accepts 1 to 10 emails\n- `generate email` supports optional `--style` and `--tone`\n\n## Team\n\n```bash\nsequenzy team list\nsequenzy team invite teammate@example.com --role admin\nsequenzy team invite finance@example.com --role viewer --billing-access\nsequenzy team cancel-invitation inv_123 --yes\n```\n\nBehavior:\n\n- `team list`: `GET /api/v1/team`; returns the owner, members, and pending or expired invitations\n- `team invite`: `POST /api/v1/team/invitations` with `{ email, role, canManageBilling? }`\n- `team cancel-invitation`: `DELETE /api/v1/team/invitations/:invitationId`\n\nCaveats:\n\n- `--role` must be `admin` or `viewer`\n- inviting and cancelling invitations requires owner or admin access; `--billing-access` can only be granted by the company owner\n- existing Sequenzy users are added to the team immediately; new emails receive an invitation that expires after 14 days\n- run `team list` first to find invitation IDs before cancelling\n- `cancel-invitation` prompts for confirmation; pass `--yes` to skip\n- MCP parity: `list_team_members`, `invite_team_member`, and `cancel_team_invitation`\n\n## Inbox\n\n```bash\nsequenzy inbox list --status open --unread\nsequenzy inbox list --search \"refund\" --page 2 --limit 50\nsequenzy inbox get conv_123\nsequenzy inbox reply conv_123 --text \"Thanks for reaching out!\"\nsequenzy inbox reply conv_123 --html-file ./reply.html --subject \"Re: your question\"\nsequenzy inbox reply conv_123 --text \"Customer asked for a refund\" --note\nsequenzy inbox close conv_123\nsequenzy inbox reopen conv_123\nsequenzy inbox mark-read conv_123\n```\n\nBehavior:\n\n- `inbox list`: `GET /api/v1/conversations` with optional `status` (`open`, `closed`, `all`), `search`, `unread`, `page`, and `limit` (1-100, default 20) query parameters\n- `inbox get`: `GET /api/v1/conversations/:conversationId`; returns the conversation with its full message history\n- `inbox reply`: `POST /api/v1/conversations/:conversationId/messages`\n- `inbox close` and `inbox reopen`: `POST /api/v1/conversations/:conversationId/status` with `{ status: \"closed\" | \"open\" }`\n- `inbox mark-read`: `POST /api/v1/conversations/:conversationId/read`; reports how many messages were marked read\n\nCaveats:\n\n- the inbox collects subscriber replies to campaigns, sequences, and transactional email\n- `reply` requires a body from `--text` and/or `--html-file`\n- `--note` adds an internal note instead of emailing the subscriber\n- outbound replies are sent asynchronously by a worker, so the message starts in `pending` delivery status; they also reopen closed conversations\n- MCP parity: `list_conversations`, `get_conversation`, `reply_to_conversation`, `update_conversation_status`, and `mark_conversation_read`\n\n## Webhooks\n\n```bash\nsequenzy webhooks list\nsequenzy webhooks create --name CI --url https://example.com/hook --event email.bounced subscriber.unsubscribed\nsequenzy webhooks create --name \"All events\" --url https://example.com/hook\nsequenzy webhooks update wh_123 --url https://example.com/new-hook\nsequenzy webhooks update wh_123 --event email.bounced email.complained\nsequenzy webhooks update wh_123 --disable\nsequenzy webhooks delete wh_123 --yes\nsequenzy webhooks test wh_123\nsequenzy webhooks deliveries wh_123 --limit 50\nsequenzy webhooks replay wh_123 del_456\n```\n\nBehavior:\n\n- `webhooks list`: `GET /api/v1/webhooks`\n- `webhooks create`: `POST /api/v1/webhooks` with `{ name, url, events? }`\n- `webhooks update`: `PATCH /api/v1/webhooks/:id` with at least one of `--name`, `--url`, `--event`, `--enable`, or `--disable`\n- `webhooks delete`: `DELETE /api/v1/webhooks/:id`; this permanently deletes the endpoint and its delivery history\n- `webhooks test`: `POST /api/v1/webhooks/:id/test`\n- `webhooks deliveries`: `GET /api/v1/webhooks/:id/deliveries`, optionally with `?limit=` (1-100)\n- `webhooks replay`: `POST /api/v1/webhooks/:id/deliveries/:deliveryId/replay`\n\nCaveats:\n\n- valid event types are `email.sent`, `email.delivered`, `email.delivery_delayed`, `email.bounced`, `email.complained`, `email.opened`, `email.clicked`, `email.unsubscribed`, `subscriber.invalid`, `subscriber.updated`, `subscriber.unsubscribed`, `sequence.finished`, and `sequence.failed`; omit `--event` to use the default set\n- `create` returns a signing secret exactly once and it cannot be retrieved later; handle it as sensitive output. Do not paste credential material into chat, logs, tickets, or public transcripts. Save it only to a user-approved secure destination such as a password manager, secret store, encrypted file, or local `.env` file outside version control, then report the storage location and a short fingerprint.\n- `--enable` and `--disable` are mutually exclusive; changing the URL or re-enabling resets the failure circuit breaker\n- the webhook must be enabled to receive a test event\n- run `webhooks deliveries <id>` first to find delivery IDs before replaying\n- `delete` prompts for confirmation; pass `--yes` to skip\n- MCP parity: `list_webhooks`, `create_webhook`, `update_webhook`, `delete_webhook`, `test_webhook`, `list_webhook_deliveries`, and `replay_webhook_delivery`\n\n## API Keys\n\n```bash\nsequenzy api-keys create\nsequenzy api-keys create --name \"CI deploy key\" --company comp_123\n```\n\nBehavior:\n\n- sends `POST /api/v1/api-keys`\n- body shape is `{ name }`\n\nCaveat:\n\n- newly created API credential material is returned only at creation time; handle it as sensitive output. Do not paste it into chat, logs, tickets, or public transcripts. Save it only to a user-approved secure destination such as a password manager, secret store, encrypted file, or local `.env` file outside version control, then report the storage location and a short fingerprint.\n\n## Websites\n\n```bash\nsequenzy websites list --company comp_123\nsequenzy websites add example.com --company comp_123\nsequenzy websites check example.com --company comp_123\nsequenzy websites guide --framework nextjs --use-case transactional\n```\n\nBehavior:\n\n- `websites list`: `GET /api/v1/websites`\n- `websites add`: `POST /api/v1/websites`\n- `websites check`: `GET /api/v1/websites/:domain`\n- `websites guide`: `POST /api/v1/integration-guide`\n\n## Feedback\n\n```bash\nsequenzy feedback \"No command to bulk-delete campaigns by label\" --category missing_capability\nsequenzy feedback \"Segment coun\n\nArchive v1.3.0: 6 files, 26040 bytes\n\nFiles: agents/openai.yaml (233b), references/command-reference.md (34830b), references/use-cases.md (26505b), skill-card.md (2802b), SKILL.md (9364b), _meta.json (143b)\n\nArchive v1.2.0: 6 files, 18347 bytes\n\nFiles: agents/openai.yaml (233b), references/command-reference.md (21293b), references/use-cases.md (18238b), skill-card.md (2557b), SKILL.md (7226b), _meta.json (143b)\n\nArchive v1.1.8: 6 files, 16928 bytes\n\nFiles: agents/openai.yaml (233b), references/command-reference.md (19178b), references/use-cases.md (16660b), skill-card.md (2939b), SKILL.md (6615b), _meta.json (143b)\n\nArchive v1.1.7: 6 files, 16937 bytes\n\nFiles: agents/openai.yaml (233b), references/command-reference.md (19203b), references/use-cases.md (16660b), skill-card.md (2884b), SKILL.md (6615b), _meta.json (143b)\n\nArchive v1.1.6: 6 files, 15918 bytes\n\nFiles: agents/openai.yaml (233b), references/command-reference.md (18269b), references/use-cases.md (15822b), skill-card.md (2311b), SKILL.md (6148b), _meta.json (143b)","readmeExcerpt":"Skill: Sequenzy Email Marketing Owner: polnikale Summary: Agent guide for using Sequenzy safely Tags: latest:1.6.0 Version history: v1.6.0 | 2026-08-04T21:06:05.547Z | user Full CLI/MCP parity sync: documents events, subscriber imports/notes/bulk tags, transactional template management, email-sends, suppressions, campaign audience/render/unschedule/resend-to-non-openers, recurring scheduling, forms, landing pages, se","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"sequenzy login"},{"language":"bash","snippet":"sequenzy whoami\nsequenzy account\nsequenzy logout"},{"language":"bash","snippet":"SEQUENZY_API_KEY=...\nSEQUENZY_API_URL=https://api.sequenzy.com\nSEQUENZY_APP_URL=https://sequenzy.com"},{"language":"bash","snippet":"sequenzy urls --company comp_123\nsequenzy urls --company comp_123 --sequence seq_123\nsequenzy urls --company comp_123 --campaign camp_123\nsequenzy urls --company comp_123 --template tmpl_123\nsequenzy urls --company comp_123 --landing-page lp_123\nsequenzy urls --company comp_123 --transactional tx_123\nsequenzy urls --company comp_123 --email-send send_123\nsequenzy urls --company comp_123 --settings-tab integrations\nsequenzy urls --company comp_123 --json"},{"language":"bash","snippet":"sequenzy stats\nsequenzy stats --period 30d\nsequenzy stats --start \"2026-05-01T00:00:00Z\" --end \"2026-05-31T00:00:00Z\"\nsequenzy stats --campaign camp_123\nsequenzy stats --sequence seq_123\nsequenzy stats --transactional password-reset\nsequenzy stats --email-type transactional\nsequenzy stats --campaign camp_123 --mailbox-provider gmail\nsequenzy stats --campaign camp_123 --include-bots"},{"language":"bash","snippet":"sequenzy events --campaign camp_123\nsequenzy events --sequence seq_123 --event-types delivery,open,click\nsequenzy events --campaign camp_123 --type open --period 24h --page 2 --limit 100"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: sequenzy-email-marketing\ndescription: Primary agent guide for operating Sequenzy as an email-marketing platform. Use when Codex needs to authenticate, inspect identity, manage subscribers, create or edit campaigns/sequences/templates, control the campaign lifecycle (cancel, pause, resume, delete, duplicate), run campaign A/B tests, mutate lists/tags/segments, enroll subscribers into sequences, invite team members, triage and reply to inbox conversations, manage outbound webhooks, generate draft email content, send transactional email, read delivery stats, or decide whether a requested Sequenzy email-marketing workflow is currently supported. Prefer this over the generic sequenzy skill when both seem relevant.\n---\n\n# Sequenzy Email Marketing\n\n## Overview\n\nUse this as the default skill for Sequenzy email-marketing/product operations: subscribers, lists, tags, segments, campaigns, sequences, templates, AI email generation, transactional sends, delivery stats, dashboard URLs, CLI/MCP behavior, and currently-supported workflow checks. Prefer the `sequenzy` CLI for supported workflows, treat `packages/mcp/src/tools/index.ts` as the MCP source of truth when the task goes through MCP tools, and explicitly call out when a requested workflow is not wired in the current implementation. If both `sequenzy` and `sequenzy-email-marketing` match, load this skill first.\n\n## Ground Rules\n\n1. Treat `packages/cli/src/index.tsx` as the source of truth for which commands are actually wired.\n2. Treat `packages/cli/src/commands/` and `packages/cli/src/api.ts` as the source of truth for CLI behavior, payload shape, and API routes.\n3. Treat `packages/mcp/src/tools/index.ts` as the source of truth for MCP tool names, arguments, and preflight validation.\n4. Do not promise support for commands or tools that only appear in docs or `--help` text without an attached implementation.\n5. Prefer `sequenzy login` for interactive auth and `SEQUENZY_API_KEY` for automation.\n6. Prefer inspection before mutation whenever the workflow allows it.\n\n## Supported Workflows\n\nRead [references/use-cases.md](references/use-cases.md) before executing anything non-trivial. The currently implemented CLI flows are:\n\n- login and logout\n- local auth/session check with `whoami`\n- account inspection with `account`\n- company inspection, creation, or brand/sender-identity updates with `companies list|get|create|update`\n- stats overview or stats by campaign, sequence, or transactional ID, with custom `--start`/`--end` ranges, `--email-type` and `--mailbox-provider` scoping, `--include-bots`, and campaign `clickedLinks` plus poll/NPS `polls` arrays\n- raw delivery/engagement event listing with `events --campaign|--sequence`, and per-delivery inspection with `email-sends list|get` plus bounce-suppression cleanup with `suppressions get|remove`\n- subscribers `list`, `add`, `update`, `get`, and `remove`, with `list` fetching every page by default and supporting tag, segment, and list filters; `add` and"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn796v6hksmtm8ahgrwbcw6t8x83ctec\",\n  \"slug\": \"sequenzy-email-marketing\",\n  \"version\": \"1.6.0\",\n  \"publishedAt\": 1785877565547\n}"},{"path":"references/command-reference.md","content":"# Command Reference\n\n## Source Of Truth\n\n- Command registration: `packages/cli/src/index.tsx`\n- Auth storage and config: `packages/cli/src/config.ts`\n- HTTP requests: `packages/cli/src/api.ts`\n- Implemented handlers: `packages/cli/src/commands/`\n\nIf docs and code disagree, trust the code.\n\n## Authentication\n\n### Interactive login\n\n```bash\nsequenzy login\n```\n\n- starts device auth against `POST /api/device-auth/initiate`\n- polls `POST /api/device-auth/poll`\n- opens `${SEQUENZY_APP_URL}/setup/auth?code=...` in the browser\n- stores the API key in `Bun.secrets` when available, otherwise in local config\n\n### Non-interactive auth\n\nSet `SEQUENZY_API_KEY` in the environment. `packages/cli/src/config.ts` checks this before local storage, so it is the safest path for automation.\n\n### Identity and logout\n\n```bash\nsequenzy whoami\nsequenzy account\nsequenzy logout\n```\n\nBehavior:\n\n- `whoami` prints cached local config only\n- `account`: `GET /api/v1/account`\n- `logout` removes locally stored auth\n\nCaveat:\n\n- treat `whoami` as \"is this machine authenticated?\" rather than authoritative server-side account discovery\n\n## Environment Variables\n\n```bash\nSEQUENZY_API_KEY=...\nSEQUENZY_API_URL=https://api.sequenzy.com\nSEQUENZY_APP_URL=https://sequenzy.com\n```\n\nNotes:\n\n- `SEQUENZY_API_KEY` overrides local keychain/config state\n- the current CLI code defaults `SEQUENZY_APP_URL` to `https://sequenzy.com`\n- many company-scoped commands accept `--company`, which sends `x-company-id` for personal API keys\n\n## Dashboard URLs\n\n```bash\nsequenzy urls --company comp_123\nsequenzy urls --company comp_123 --sequence seq_123\nsequenzy urls --company comp_123 --campaign camp_123\nsequenzy urls --company comp_123 --template tmpl_123\nsequenzy urls --company comp_123 --landing-page lp_123\nsequenzy urls --company comp_123 --transactional tx_123\nsequenzy urls --company comp_123 --email-send send_123\nsequenzy urls --company comp_123 --settings-tab integrations\nsequenzy urls --company comp_123 --json\n```\n\nBehavior:\n\n- uses `SEQUENZY_APP_URL` as the base URL, defaulting to `https://sequenzy.com`\n- if `--company` is omitted, tries the current company from `GET /api/v1/account`\n- returns route templates, settings tab values, and concrete URLs when a company ID is known\n- also accepts `--email <id>` (email editor), `--domain <id>` (sending domain), and `--status` for campaign/sequence list URLs\n- campaign, sequence, template, company, and account outputs include `url` or `appUrls` fields when the company can be resolved\n\nCommon route patterns:\n\n- sequence editor: `/dashboard/company/{companyId}/sequences/{sequenceId}`\n- campaign editor: `/dashboard/company/{companyId}/campaign/{campaignId}`\n- template/email editor: `/dashboard/company/{companyId}/emails/{emailId}`\n- settings: `/dashboard/company/{companyId}/settings`\n- settings tab: `/dashboard/company/{companyId}/settings?tab={tab}`\n\n## Stats\n\n```bash\nsequenzy stats\nsequenzy stats --period 30d\nsequenzy stats --start \"2026-05-01T00:00:00Z\" --end \"202"},{"path":"references/use-cases.md","content":"# Use Cases\n\n## Pick The Right Flow\n\n### \"Log into Sequenzy on this machine\"\n\nUse:\n\n```bash\nsequenzy login\n```\n\nThen verify:\n\n```bash\nsequenzy whoami\n```\n\nPrefer `SEQUENZY_API_KEY` instead when the task is fully non-interactive or running in CI.\n\n## \"Check whether I am authenticated\"\n\nUse:\n\n```bash\nsequenzy whoami\n```\n\nInterpretation:\n\n- success means a local API key is available\n- failure means the agent should ask for login or a `SEQUENZY_API_KEY`\n\nRemember that this is local-state validation, not a fresh server-side account lookup.\n\n## \"Show me account or company info\"\n\nUse:\n\n```bash\nsequenzy account\nsequenzy companies list\nsequenzy companies get comp_123\nsequenzy urls --company comp_123\n```\n\nChoose:\n\n- `account` for user ID, current company, and accessible companies\n- `companies list` for a compact list with localization info\n- `companies get` when the user already has a company ID\n- `urls` when the user needs a dashboard/settings link\n\n## \"Open, review, or edit something I just created\"\n\nPrefer the `url` or `appUrls` fields returned by recent CLI/MCP calls. If you need to generate links from IDs:\n\n```bash\nsequenzy urls --company comp_123 --sequence seq_123\nsequenzy urls --company comp_123 --campaign camp_123\nsequenzy urls --company comp_123 --settings-tab integrations\n```\n\nMCP equivalent: call `get_app_urls` with:\n\n```json\n{\n  \"companyId\": \"comp_123\",\n  \"sequenceId\": \"seq_123\",\n  \"settingsTab\": \"integrations\"\n}\n```\n\nURL patterns:\n\n- sequence editor: `/dashboard/company/{companyId}/sequences/{sequenceId}`\n- campaign editor: `/dashboard/company/{companyId}/campaign/{campaignId}`\n- template/email editor: `/dashboard/company/{companyId}/emails/{emailId}`\n- settings: `/dashboard/company/{companyId}/settings`\n- settings tab: `/dashboard/company/{companyId}/settings?tab={tab}`\n\nAfter generating a sequence or campaign, give the user the relevant review/edit URL instead of only returning the ID.\n\n## \"Show me delivery performance\"\n\nUse:\n\n```bash\nsequenzy stats\nsequenzy stats --period 30d\nsequenzy stats --campaign camp_123\nsequenzy stats --sequence seq_123\n```\n\nChoose:\n\n- plain `stats` for account-level overview\n- `--campaign` when the user gives a campaign ID\n- `--sequence` when the user gives a sequence ID\n\nAsk for the missing ID instead of guessing.\n\n## \"Add or update a subscriber\"\n\nWhat works today:\n\n```bash\nsequenzy subscribers add user@example.com --tag premium --attr name=John\nsequenzy subscribers add user@example.com --tag premium --tag beta --company comp_123\nsequenzy subscribers get user@example.com\nsequenzy subscribers list --list \"Master List\" --json\n```\n\nGuidance:\n\n- use `add` for single-recipient creation or upsert\n- use repeated `--attr key=value` pairs for metadata\n- repeated `--tag` values are supported\n- use `--company` when the API key can access multiple companies\n- use `subscribers get` when you need the full profile, list memberships, sequence enrollments, email stats, or recent activity\n- use `subscribers list --list <id-or-exact"},{"path":"skill-card.md","content":"## Description:\n\nGuides agents through Sequenzy email-marketing operations, including authentication, subscriber management, campaign and sequence workflows, templates, transactional sends, analytics, and supported workflow checks.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[polnikale](https://clawhub.ai/user/polnikale)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal Sequenzy operators and developers use this skill to select safe CLI or MCP workflows for email-marketing account operations, from subscriber and audience management through campaigns, sequences, transactional sends, and reporting.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can guide agents through privileged Sequenzy account operations that affect subscribers, campaigns, sequences, team access, API keys, and webhooks.\n\nMitigation: Install only for agents trusted to operate the relevant Sequenzy account, and require explicit confirmation before destructive actions, live or scheduled campaign changes, team changes, API-key changes, and webhook operations.\n\nRisk: The skill includes feedback workflows that may send business context, identifiers, incidents, or customer information to the Sequenzy team.\n\nMitigation: Review and approve the exact feedback text before submission, and do not allow automatic feedback reports that include sensitive or customer information.\n\nRisk: Some workflows produce or handle sensitive one-time credentials such as API keys and webhook signing secrets.\n\nMitigation: Redact secrets from chat, logs, tickets, and public transcripts, and store any required values only in a user-approved secure destination.\n\n## Reference(s):\n\n- [Command Reference](references/command-reference.md)\n- [Use Cases](references/use-cases.md)\n- [ClawHub Skill Page](https://clawhub.ai/polnikale/skills/sequenzy-email-marketing)\n- [Sequenzy Application](https://sequenzy.com)\n- [Sequenzy API](https://api.sequenzy.com)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, shell commands, configuration, text, markdown]\n\n**Output Format:** [Markdown guidance with CLI commands and configuration snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include API-call guidance, dashboard URLs, and sensitive-output handling instructions.]\n\n## Skill Version(s):\n\n1.6.0 (source: release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1767,"uniquenessScore":44,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T02:25:12.219Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T02:25:12.219Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:39:37.257Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}