agentleFS
nitrosendnitrosend/claude/skills/build-flow/SKILL.md

build-flow

Skill3 starsChanged 7 months agoMITView on GitHub

Build email/SMS automation flows with triggers, steps, waits, splits, and webhooks. Covers welcome series, cart abandonment, post-purchase, win-back, browse abandonment, and custom event-driven flows. Use when: "automation flow", "welcome series", "drip campaign", "cart abandonment flow", "win-back flow", "build flow", or "email sequence".

4 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

9 rules. 0 are common, 3 are distinctive, and 6 are very specific to this project.

  • 0

    Common

    Most of the 4 edited versions we read keep these.

  • 3

    Distinctive

    This author's own choices. Worth a look.

  • 6

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Ask what kind of flow they need.

    line 17
  2. Very specific:

    Use the filter schema returned by the intent response or nitro://schema.

    line 46
  3. Distinctive:

    Prefer behavior-based branches when the necessary evidence exists.

    line 54
  4. Very specific:

    Treat next_call.input as the selected complete baseline for the flow and its email steps.

    line 69
  5. Distinctive:

    Create for real (without dry_run)

    line 93
  6. Very specific:

    Every nitro_control_delivery call requires the expected_brand_sid brand assertion from the result you reviewed — it never switches brands.

    line 104
  7. Very specific:

    Use nitro_compose_flow with mode: "replace", flow_id, confirm: true, expected_draft_revision_id (the current draft revision), and a stable …

    line 110
  8. Very specific:

    Use nitro_compose_flow with mode: "patch", flow_id, an idempotency_key, targeting email actions by action_name + their if_version …

    line 115
  9. Very specific:

    Every non-dry-run persistence mutation (create, rename patch, replace) requires an idempotency_key.

    line 119

“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Build Flow

Help the user design and create automation flows using Nitrosend.

Understand the Goal

Ask what kind of flow they need. Common patterns:

Flow TypeTrigger EventTypical Steps
Welcome seriescontact_addEmail 1 (immediate) -> Wait 1d -> Email 2 -> Wait 2d -> Email 3
Cart abandonmentcart_abandonedWait 1h -> Email 1 -> Wait 1d -> Email 2 (with discount)
Post-purchasecheckout or customEmail 1 (thank you) -> Wait 3d -> Email 2 (review request)
Win-backCustom event or segmentEmail 1 -> Wait 3d -> Split (opened?) -> Yes: Email 2 / No: Email 3
Browse abandonmentbrowse_abandonedWait 2h -> Email with viewed products
Onboardingcontact_add or customWelcome -> Wait 1d -> Getting started -> Wait 2d -> Feature highlight
Re-engagementCustom triggerEmail 1 -> Wait 7d -> Split (engaged?) -> Yes: normal cadence / No: final offer

Design the Flow

Available Step Types

StepRequired PropsNotes
emailsubject + (design or body)Design uses {sections, theme}
smsbodySMS text content
waitduration (seconds)3600=1hr, 86400=1day, 604800=1week
splitfilters, yes steps, no stepsConditional branching; splits may nest inside yes/no branches
emit_eventevent_nameFire event to trigger other flows
webhookurlPOST or PUT to external URL
subscribechannel (phone/email/all)Opt contact in
unsubscribechannel (phone/email/all)Opt contact out

Split Filters

Use the filter schema returned by the intent response or nitro://schema; do not assume this document is an exhaustive registry. Common current filters include contact identity and subscription fields, tags and lists, creation and interaction timestamps, delivery/engagement metrics such as contact_last_opened_at and contact_last_clicked_at, event history, and custom or enrichment fields. Use only names and predicates accepted by the live schema.

Prefer behavior-based branches when the necessary evidence exists. Keep waits and message frequency proportionate to the user's audience and test the cadence against account performance rather than asserting universal timings.

Create the Flow

Use nitro_compose_flow with:

  • name: Descriptive flow name
  • trigger: { event: "trigger_event_name" } — optionally add segment_id or contact_list_id
  • steps: Array of step objects

Offer dry_run: true first to preview the flow graph.

Composition contract: any newly authored email step enters the contract before persistence. Call nitro_compose_flow with composition_mode: "intent". Treat next_call.input as the selected complete baseline for the flow and its email steps; preserve and fill it by default. Use the compact composition_contract.creative_routes menu and start a fresh intent with creative_route_id to select another ready route (that top-level field applies one route to the whole sequence; to assign routes per email in a multi-email flow, use email_baseline_selections entries of action_name + route_id — plus that email's image_binding_ids when the route is image-led — as the returned contract describes). If that route lacks frozen evidence, obtain the exact reported facts. Never fall back silently or invent evidence.

For image-led routes, follow next_call.image_choice and supply an exact image URL plus an accurate description. Preserve all contract, binding, user constraint, and idempotency fields. Optionally validate, then persist with composition_mode: "draft"; full section authoring is an intentional escape hatch. The returned metered optional_server_authoring_call (composition_mode: "generate") may instead author, validate, and persist one draft. SMS-only flows and rename-only patches do not need email authoring context.

Review and Approve

  1. Show the dry-run preview (node types and connections)
  2. Get user approval on the flow design
  3. Create for real (without dry_run)
  4. Review: nitro_review_delivery with target_type: "flow", target_id, and the exact current revision_id (flow reviews require it)
  5. Approve: nitro_control_delivery with target_type: "flow", target_id, operation: "approve", the exact current draft revision_id, and expected_brand_sid (copy meta.current_brand.sid from the review result)
  6. Go live: nitro_control_delivery with target_type: "flow", target_id, operation: "live", revision_id, and expected_brand_sid

Flow approve, reject, and live all require the exact current draft revision_id; pause/resume omit it, and resume never publishes a draft. Every nitro_control_delivery call requires the expected_brand_sid brand assertion from the result you reviewed — it never switches brands.

Modify Existing Flows

To rebuild an existing flow:

  • Use nitro_compose_flow with mode: "replace", flow_id, confirm: true, expected_draft_revision_id (the current draft revision), and a stable idempotency_key

To rename or update selected email actions:

  • Use nitro_compose_flow with mode: "patch", flow_id, an idempotency_key, targeting email actions by action_name + their if_version concurrency token

Every non-dry-run persistence mutation (create, rename patch, replace) requires an idempotency_key; drafts persisted through the composition contract reuse the stable key supplied by the returned next_call.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.