8 min left

    0% read

    Build a Competitive Intelligence System That Updates Itself
    AI
    APR 14, 2026

    Build a Competitive Intelligence System That Updates Itself

    Stop manually checking G2, pricing pages, and app store reviews every week. Here's how I built a system using Apify, Notion, Claude, and Slack that delivers competitor signals automatically — with AI analysis included.

    Product ManagementAutomationAITools
    ⚠️

    Identifying

    The Problem

    Most PMs do competitive research the same way: open a browser, manually check 5 competitor pages, copy-paste into a doc, try to remember what changed from last month. It's time-consuming, inconsistent, and completely reactive.

    ↳

    By the time you notice a competitor's pricing change or a surge in negative reviews, the window to respond has already passed.

    Built with
    Apify

    Apify

    Web Scraping

    Notion

    Notion

    Database

    Claude API

    Claude API

    AI Analysis

    Slack

    Slack

    Notifications

    n8n / Zapier

    n8n / Zapier

    Automation

    At a glance

    ⏱
    4–6 hrs (first time)
    Build time
    🔧
    ~0 hrs
    Weekly maintenance
    💰
    $0.05–$0.15
    Weekly cost

    I spent about a weekend building a lightweight system that now runs every Monday morning and drops a clean summary into our team's Slack channel, automatically. It tracks pricing page changes, scrapes new G2/Capterra reviews, monitors app store ratings, and uses Claude to synthesize everything into actionable signals.

    Here's exactly how to build it, step by step.

    This Isn't Theoretical, People Are Already Building It

    💡
    Why This Matters
    All three examples above were built and published in the last 2 weeks, which means the demand for this kind of system is real and growing fast. The approach below combines the best patterns from all three.

    The Architecture

    Before diving into the setup, here's the full flow at a glance:

    System architecture
    System architecture

    Step 1, Set Up Your Apify Scrapers

    Apify has a marketplace of pre-built actors, so you don't need to write scrapers from scratch. For competitive intelligence, I use three:

    • Website Content Crawler, for competitor pricing and features pages (URL snapshots weekly)
    • G2 Reviews Scraper, pulls latest reviews, star ratings, and "pros/cons" text for any G2-listed product
    • Google Play / App Store Scraper, grabs new reviews and monitors rating changes

    Configure each actor with your list of competitor URLs and set the schedule to weekly (every Monday at 7am, so the data is ready before your Slack post at 9am). In the actor output settings, enable Dataset export as JSON.

    Apify actor marketplace
    Apify actor marketplace

    Once an Apify run completes, use the Apify API to fetch the dataset:

    Bash
    # Fetch latest dataset run from Apify
    GET https://api.apify.com/v2/acts/{actorId}/runs/last/dataset/items
        ?token={YOUR_APIFY_TOKEN}
        &format=json
        &limit=50
    
    ✅
    Pro Tip
    Don't scrape everything. Pick 3 to 5 direct competitors and track 2 to 3 signals each. More data = more noise for Claude to filter. Start focused, expand later.

    Step 2, Design Your Notion Database

    Notion serves as the long-term memory of your system. Each row = one competitor. Each week, the automation updates the row with the latest scraped data, which lets you diff against last week's values.

    The database is divided into 3 sections:

    Notion Competitor Database Schema
    Notion Competitor Database Schema

    In your n8n workflow, after fetching from Apify, use the Notion node to read each competitor's current record, write the existing Pricing Snapshot into Previous Pricing, then update Pricing Snapshot with the new scrape. This gives you a clean before/after pair to send to Claude.

    🗃️Competitor Intelligence DBNotion Database
    Property
    Type
    Identity
    Competitor Name
    Title
    Weekly Scraped Datavia Apify + n8n
    Pricing Snapshot
    Text
    Previous Pricing
    Text
    G2 Rating
    Number
    Recent Reviews
    Text
    App Store Rating
    Number
    Last Updated
    Date
    AI Analysisvia Claude
    Claude Analysis
    Text
    Signal Flag
    Select
    📦
    Resource: Notion Template
    Duplicate the exact database used in this build.
    Grab Template

    Step 3, Build the Claude Analysis Layer

    This is where the system gets genuinely useful. Instead of dumping raw scraped text into Slack, you send Claude a structured prompt with the before/after data and ask it to identify what actually matters.

    Claude System Prompt

    You are a competitive intelligence analyst for a B2B SaaS product manager.
    You will be given weekly scraped data about a competitor.
    Your job is to identify changes that have strategic significance.
    
    Return your analysis in this exact format:
    1. SIGNAL LEVEL: [HIGH / MEDIUM / LOW]
    2. KEY CHANGES: Bullet list of concrete changes detected (max 4)
    3. STRATEGIC IMPLICATION: 2–3 sentences on what this means for our product
    4. SUGGESTED ACTION: One specific thing the PM team should do this week
    
    Be concise. Skip anything that didn't change. If nothing meaningful changed, say so clearly.
    

    Claude User Message (populated dynamically)

    ## Competitor: {{competitor_name}}
    
    ### Previous Pricing Page (last week):
    {{previous_pricing}}
    
    ### Current Pricing Page (this week):
    {{current_pricing}}
    
    ### G2 Rating Change:
    {{prev_g2_rating}} → {{current_g2_rating}}
    
    ### Recent Customer Reviews:
    {{recent_reviews}}
    

    Claude API call from n8n HTTP Request node

    JSON
    {
      "method": "POST",
      "url": "https://api.anthropic.com/v1/messages",
      "headers": {
        "x-api-key": "{{$credentials.claudeApiKey}}",
        "anthropic-version": "2023-06-01",
        "content-type": "application/json"
      },
      "body": {
        "model": "claude-sonnet-4-20250514",
        "max_tokens": 600,
        "system": "{{systemPrompt}}",
        "messages": [
          {
            "role": "user",
            "content": "{{userMessage}}"
          }
        ]
      }
    }
    

    n8n workflow showing HTTP Request node configured with Claude API call
    n8n workflow showing HTTP Request node configured with Claude API call

    💰
    Cost Note
    Running this for 5 competitors weekly costs roughly $0.05–$0.15 per week using Claude Sonnet. Entirely negligible for the value it provides.
    ~$0.10
    per week

    Step 4, Format & Post to Slack

    Claude's output gets assembled into a clean Slack message using Block Kit. Here's what the Slack Block Kit payload looks like:

    JSON
    {
      "text": "🔴 Weekly Competitive Brief, 3 signals detected",
      "blocks": [
        {
          "type": "section",
          "text": {
            "type": "mrkdwn",
            "text": "🏢 *Competitor:* Rival SaaS Co.\n📊 *Change:* Dropped Starter plan price by 20% · Added AI Summaries to free tier\n⚡ *Significance:* High\n💡 *Action:* Review our free tier value prop, especially features we gate behind paid that they now offer free"
          }
        }
      ]
    }
    

    Example output in #competitive-intel:

    CompeteBot [APP]  Monday 9:00 AM
    ─────────────────────────────────────────────
    🔴 Weekly Competitive Brief, 3 signals detected
    
    │ Competitor: Rival SaaS Co.
    │ Signal Level: 🔴 HIGH
    │ Key Changes: Dropped Starter plan price by 20% · Added "AI Summaries"
    │              to free tier · Removed per-seat pricing on Pro
    │ Implication: Aggressive move to undercut our entry-level positioning.
    │              Free tier expansion likely targeting our trial-to-paid funnel.
    │ Suggested Action: Review our free tier value prop this week.
    

    In n8n, use the Slack node with a chat.postMessage action. Map Claude's SIGNAL LEVEL output to an emoji flag (🔴 HIGH, 🟡 MEDIUM, 🟢 LOW) to make it scannable at a glance.

    #competitive-intel Slack message
    #competitive-intel Slack message

    ⚠️
    Watch Out For
    Apify sometimes returns stale cached pages for heavily CDN'd sites. If a competitor's pricing page isn't changing when you know it should, try setting the actor's requestTimeoutSecs to 30 and disabling caching in the input schema.

    The Full n8n Workflow (Node by Node)

    1. Cron Trigger, Every Monday at 7:00am
    2. HTTP Request (Apify), Trigger actor runs for all 3 scraper types
    3. Wait, 5 minute delay (let scrapes complete)
    4. HTTP Request (Apify), Fetch completed dataset JSONs
    5. Notion (Read), Pull each competitor's existing row (for previous snapshot)
    6. Code node, Diff current vs previous, build Claude prompt strings
    7. HTTP Request (Claude API), One call per competitor
    8. Notion (Update), Write Claude's analysis + new snapshots back to Notion
    9. Slack, Post formatted message to #competitive-intel

    Total build time: about 4–6 hours the first time. Once it's running, it's zero maintenance unless a competitor site changes its HTML structure significantly (which Apify usually handles automatically anyway).

    n8n full workflow canvas with all nodes connected
    n8n full workflow canvas with all nodes connected

    📦
    Resource: n8n Workflow Template
    Skip the manual build, import the pre-built workflow JSON directly into n8n.
    Download JSON

    What You Actually Get

    ⏱
    ~4 hrs
    Time Saved
    per week vs. manual competitive review
    🚀
    <48 hrs
    Lag Reduced
    from weeks to under 48 hours
    📊
    1 place
    Single Source
    one Notion database for your entire competitive landscape

    More importantly, it changes how your team thinks about competition. When intel is delivered to you instead of requiring active effort, strategy conversations stop starting from "I think our competitor did something last month" and start from "here's exactly what changed this week and here's what it means."

    Extensions Worth Adding Later

    • LinkedIn job postings scraper, What a competitor is hiring for tells you what they're building next. Apify has a LinkedIn Jobs actor.
    • Product Hunt / Twitter mentions, Track when competitors launch something new or get a spike in mentions.
    • Claude memory across weeks, Pass the last 4 weeks of Claude analyses back into the prompt to detect longer-term trends, not just weekly deltas.
    • Urgency routing, If Claude returns HIGH signal, trigger a separate Slack DM to the Head of Product, not just the channel post.
    ✅
    Start Small
    Build this for one competitor first. Get the Apify → Notion → Claude → Slack loop working cleanly before scaling to 5 competitors. Each addition is just cloning the workflow with new URLs.

    Final Thought

    The best competitive intelligence systems aren't the most comprehensive ones, they're the ones that actually get read. A crisp, weekly Slack briefing that takes 90 seconds to consume will always beat a 40-page competitive deck that gets opened once a quarter.

    Build the system that makes it easy to stay informed, and your team's competitive awareness will compound over time without anyone having to make a conscious effort to maintain it.

    Similar Topics

    AI

    Loops Engineering for Product Development: How to Increase AI Efficiency

    13 min readJul 26, 2026
    AI

    Forward-Deployed AI PMs Are Changing How Products Get Built

    8 min readJun 9, 2026
    AI

    I Tried Replacing Traditional User Personas with AI — Here's What I Learned

    9 min readMay 28, 2026