Swirls

SWIRLS_

  • How it works
  • Pricing

56 matches

OverviewDeliver client operations10Win and grow accounts8Resolve customer issues6Create and distribute content9Run people and operations5Review money and agreements3Monitor systems and data9Compose dependable work6

56 matches

OverviewDeliver client operations10Win and grow accounts8Resolve customer issues6Create and distribute content9Run people and operations5Review money and agreements3Monitor systems and data9Compose dependable work6
← Sales & MarketingScheduleView on GitHub

Competitive Intel Monitor

Scrapes competitor sites weekly and emails a summary of changes.

scrapeaiemail

Source

/**
 * Scrapes competitor websites weekly and summarizes changes.
 */

schedule weekly_intel {
  label: "Weekly Intel Scan"
  cron: "0 9 * * 1"
  timezone: "America/New_York"
}

workflow scan_competitors {
  label: "Scan Competitors"

  root {
    type: code
    label: "Start"
    code: @ts {
      return { scanned_at: new Date().toISOString() }
    }
    outputSchema: @json {
      {
        "type": "object",
        "properties": {
          "scanned_at": { "type": "string" }
        }
      }
    }
  }

  node scrape_homepage {
    type: scrape
    label: "Scrape competitor homepage"
    url: @ts { return "https://stripe.com" }
    onlyMainContent: true
    formats: ["markdown"]
  }

  node scrape_changelog {
    type: scrape
    label: "Scrape competitor changelog"
    url: @ts { return "https://stripe.com/blog" }
    onlyMainContent: true
    formats: ["markdown"]
  }

  node analyze {
    type: ai
    label: "Analyze changes"
    kind: object
    model: "google/gemini-2.5-flash"
    prompt: @ts {
      return "Analyze these competitor pages for notable changes, new features, or strategic shifts.\n\nHomepage:\n" + JSON.stringify(context.nodes.scrape_homepage.output) + "\n\nChangelog:\n" + JSON.stringify(context.nodes.scrape_changelog.output)
    }
    schema: @json {
      {
        "type": "object",
        "required": ["summary", "key_changes"],
        "properties": {
          "summary": { "type": "string" },
          "key_changes": { "type": "array", "items": { "type": "string" } },
          "new_features": { "type": "array", "items": { "type": "string" } },
          "strategic_implications": { "type": "string" }
        }
      }
    }
  }

  node send_report {
    type: email
    label: "Send intel report"
    from: @ts { return "[email protected]" }
    to: @ts { return "[email protected]" }
    subject: @ts { return "Weekly Competitive Intel - " + context.nodes.root.output.scanned_at.split("T")[0] }
    text: @ts {
      const report = context.nodes.analyze.output
      const changes = report.key_changes.map(function(c, i) { return (i + 1) + ". " + c }).join("\n")
      return "Summary: " + report.summary + "\n\nKey Changes:\n" + changes + "\n\nStrategic Implications: " + (report.strategic_implications || "None noted")
    }
  }

  flow {
    root -> scrape_homepage
    root -> scrape_changelog
    scrape_homepage -> analyze
    scrape_changelog -> analyze
    analyze -> send_report
  }
}

trigger on_weekly_intel {
  schedule:weekly_intel -> scan_competitors
  enabled: true
}

Flow

Trigger to workflow

weekly_intelschedule
scan_competitors
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

Workflow nodes

CODE
Code Node
Start
SCRAPE
Scrape Node
Scrape competitor homepage
SCRAPE
Scrape Node
Scrape competitor changelog
AI
AI Node
Analyze changes
EMAIL
Email Node
Send intel report
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.