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.