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 & MarketingFormView on GitHub

SEO Audit

Scrapes a page and produces an SEO audit with scores, issues, and fixes.

scrapeai

Source

/**
 * Audits a webpage for SEO issues using scraping and AI analysis.
 */

form seo_audit {
  label: "SEO Audit"
  schema: @json {
    {
      "type": "object",
      "required": ["url"],
      "properties": {
        "url": { "type": "string", "format": "uri", "title": "Page URL" },
        "target_keyword": { "type": "string", "title": "Target Keyword" },
        "competitors": { "type": "string", "title": "Competitor URLs (comma-separated)" }
      }
    }
  }
}

workflow run_seo_audit {
  label: "Run SEO Audit"

  root {
    type: code
    label: "Extract request"
    code: @ts { return context.nodes.root.input }
    outputSchema: @json {
      {
        "type": "object",
        "properties": {
          "url": { "type": "string", "format": "uri" },
          "target_keyword": { "type": "string" },
          "competitors": { "type": "string" }
        }
      }
    }
  }

  node scrape_page {
    type: scrape
    label: "Scrape target page"
    url: @ts { return context.nodes.root.output.url }
    onlyMainContent: false
    formats: ["markdown", "html"]
  }

  node analyze_seo {
    type: ai
    label: "Analyze SEO"
    kind: object
    model: "google/gemini-2.5-flash"
    prompt: @ts {
      const req = context.nodes.root.output
      const page = context.nodes.scrape_page.output
      return "Perform an SEO audit of this page.\n\nURL: " + req.url + "\nTarget keyword: " + (req.target_keyword || "not specified") + "\n\nPage content:\n" + JSON.stringify(page)
    }
    schema: @json {
      {
        "type": "object",
        "required": ["score", "issues", "recommendations", "word_count"],
        "properties": {
          "score": { "type": "number", "minimum": 0, "maximum": 100 },
          "issues": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "category": { "type": "string" },
                "severity": { "type": "string", "enum": ["critical", "warning", "info"] },
                "description": { "type": "string" },
                "fix": { "type": "string" }
              }
            }
          },
          "recommendations": { "type": "array", "items": { "type": "string" } },
          "keyword_density": { "type": "number" },
          "has_meta_description": { "type": "boolean" },
          "has_h1": { "type": "boolean" },
          "word_count": { "type": "number" }
        }
      }
    }
  }

  node format_report {
    type: code
    label: "Format report"
    code: @ts {
      const audit = context.nodes.analyze_seo.output
      const critical = audit.issues.filter(function(i) { return i.severity === "critical" })
      return {
        url: context.nodes.root.output.url,
        score: audit.score,
        critical_issues: critical.length,
        total_issues: audit.issues.length,
        issues: audit.issues,
        recommendations: audit.recommendations,
        word_count: audit.word_count
      }
    }
  }

  flow {
    root -> scrape_page
    scrape_page -> analyze_seo
    analyze_seo -> format_report
  }
}

trigger on_audit {
  form:seo_audit -> run_seo_audit
  enabled: true
}

Flow

Trigger to workflow

seo_auditform
run_seo_audit
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
Extract request
SCRAPE
Scrape Node
Scrape target page
AI
AI Node
Analyze SEO
CODE
Code Node
Format 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.