← All use cases
Content & MarketingAI

Competitor Tech Stack Change Detection

Get notified when a competitor swaps their analytics, payments, or CMS - a strong leading indicator of strategy and engineering direction.

Verid Use Cases·4 min read

The scenario

A competitor swaps their analytics provider - say, from Mixpanel to PostHog. That's a meaningful signal: they care enough about analytics to migrate, and they care enough about cost or data ownership to leave a market leader. Six months later they might be a much different company.

For sales teams, the same monitor is invaluable for outbound - "they just installed Segment, that means we know which integrations they'll need."

For competitive intelligence teams, tracking when a competitor adds a new payment provider, A/B testing tool, or CDN gives early signals about engineering and product priorities.

The problem

Built-with-this-page tools (BuiltWith, Wappalyzer) exist but their free tiers are limited, their alerts are slow, and they don't speak Slack natively. You can detect most of this yourself by inspecting the page's script tags and meta information, but doing that across a watchlist of competitors gets tedious fast.

How Verid solves it

Verid's prompt extractor reads the rendered page and returns a structured list of detected technologies. A predicate fires when any of them change.

Because the LLM can reason about the page holistically - looking at script src attributes, network requests embedded in the HTML, meta tags, and visible widgets - it's surprisingly good at picking up SaaS tools the same way Wappalyzer does, without needing a maintained signature database.

Build the monitor

Extraction config

{
  "method": "prompt",
  "prompt": "Analyze this competitor homepage and identify the following technologies in use. Return each as a string (the vendor or product name) or null if not detected: analytics tool, A/B testing tool, payment processor, CMS or website builder, error tracking, customer support chat widget.",
  "schema": {
    "analytics": "string",
    "ab_testing": "string",
    "payments": "string",
    "cms": "string",
    "error_tracking": "string",
    "support_chat": "string"
  }
}

Predicate

{ "type": "any_field_changes" }

Any swap is worth knowing about. If you only care about one specific dimension (e.g. payments), narrow it:

{ "type": "field_changes", "field": "payments" }

Create the monitor

curl -X POST https://api.verid.dev/v1/monitors \
  -H "Authorization: Bearer vrd_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Tech stack - competitor.com",
    "url": "https://competitor.com",
    "schedule_interval_seconds": 86400,
    "fetch_mode": "browser",
    "extract_config": {
      "method": "prompt",
      "prompt": "Analyze this competitor homepage and identify the following technologies in use. Return each as a string (the vendor or product name) or null if not detected: analytics tool, A/B testing tool, payment processor, CMS or website builder, error tracking, customer support chat widget.",
      "schema": {
        "analytics": "string",
        "ab_testing": "string",
        "payments": "string",
        "cms": "string",
        "error_tracking": "string",
        "support_chat": "string"
      }
    },
    "diff_predicate": { "type": "any_field_changes" },
    "deliveries": [
      { "type": "slack", "webhookUrl": "https://hooks.slack.com/services/..." }
    ]
  }'

SDK:

import { VeridClient } from '@verid.dev/sdk';

const client = new VeridClient({ apiKey: 'vrd_your_api_key' });

await client.monitors.create({
  name: 'Tech stack - competitor.com',
  url: 'https://competitor.com',
  schedule_interval_seconds: 86400,
  fetch_mode: 'browser',
  extract_config: {
    method: 'prompt',
    prompt:
      'Analyze this competitor homepage and identify the following technologies in use. Return each as a string (the vendor or product name) or null if not detected: analytics tool, A/B testing tool, payment processor, CMS or website builder, error tracking, customer support chat widget.',
    schema: {
      analytics: 'string',
      ab_testing: 'string',
      payments: 'string',
      cms: 'string',
      error_tracking: 'string',
      support_chat: 'string',
    },
  },
  diff_predicate: { type: 'any_field_changes' },
  deliveries: [
    { type: 'slack', webhookUrl: 'https://hooks.slack.com/services/...' },
  ],
});

What the webhook delivers

{
  "id": "del_01H...",
  "fired_at": "2026-05-08T05:00:00Z",
  "diff": {
    "fields_changed": ["analytics", "ab_testing"],
    "before": {
      "analytics": "Mixpanel",
      "ab_testing": null,
      "payments": "Stripe",
      "cms": "Webflow",
      "error_tracking": "Sentry",
      "support_chat": "Intercom"
    },
    "after": {
      "analytics": "PostHog",
      "ab_testing": "Statsig",
      "payments": "Stripe",
      "cms": "Webflow",
      "error_tracking": "Sentry",
      "support_chat": "Intercom"
    }
  }
}

A competitor moved from Mixpanel to PostHog and added Statsig for A/B testing in the same week. Worth a strategy conversation.

Caveats & tips

  • Browser mode is essential. A lot of analytics and chat widgets only load via JavaScript after the page renders. Without fetch_mode: 'browser', the LLM won't see them in the HTML.
  • The LLM occasionally guesses. A "Powered by" footer text gives a confident answer; a script with an obfuscated CDN URL might cause a false positive. Treat one-off flips between unrelated vendors with skepticism; treat sustained changes across multiple runs as real.
  • One monitor per competitor. Each runs daily. Five competitors cost five LLM calls per day on the days they change, fewer on quiet days thanks to caching.
  • Pair with WHOIS & domain ownership changes for the strongest "this company is changing direction" signal.

Related use cases

For competitor ad and landing-page copy, see competitor ad & landing copy changes. For domain ownership signals, see WHOIS & domain ownership changes. For their job postings, see job listings for keywords.

Ship this monitor today

5 monitors free, no credit card. Set up takes about a minute.

Get started free