Handleidingen · n8n

Automatische prijsmonitoring bouwen met n8n en Claude

Automatische prijsmonitoring bouwen met n8n en Claude. Concurrenten volgen, alerts, MKB-proof.

🟢 Beginner — geen code vereist ⏱ 45 minuten
Tools: n8nClaudeGoogle SheetsGmail
Goud-op-zwart illustratie: spreadsheetdata voedt een dashboard met grafieken, marktradar en nieuwsbron

Prijzen van concurrenten veranderen vaker dan je denkt. E-commerce bedrijven passen prijzen meerdere keren per dag aan, SaaS-bedrijven veranderen plannen zonder aankondiging, en dienstverleners introduceren nieuwe pakketten die jouw aanbod plotseling duur of goedkoop laten lijken. Handmatig bijhouden is ondoenlijk.

In deze handleiding bouw je een workflow die dagelijks prijspaginas van concurrenten bezoekt, de prijzen extraheert, vergelijkt met de vorige dag, en bij een wijziging een alert stuurt met een Claude-analyse: wat betekent deze prijswijziging en wat moet jij er eventueel mee?

Wat je nodig hebt

  • n8n (cloud of self-hosted)
  • Claude API key (voor prijsextractie en analyse)
  • Google Sheets (voor prijsgeschiedenisopslag)
  • Gmail (voor alerts)
  • Lijst van concurrenten-URLs met prijspaginas

Stap 1: Prijsmonitoring Sheets aanmaken

Maak een Google Sheet 'Prijsmonitoring' met twee tabbladen. Tabblad 1 'Te Monitoren': Concurrent, URL, Product/Plan, Huidige Prijs, Laatste Check, Wijziging (ja/nee). Tabblad 2 'Geschiedenis': Datum, Concurrent, Product, Prijs, Vorige Prijs, Wijziging, Claude Analyse.

// Voorbeelddata tabblad 'Te Monitoren'
[
  { "concurrent": "SaaS A", "url": "https://saasbedrijf-a.nl/prijzen", "product": "Business plan", "huidige_prijs": "99" },
  { "concurrent": "SaaS B", "url": "https://saasbedrijf-b.nl/pricing", "product": "Pro maandelijks", "huidige_prijs": "79" },
  { "concurrent": "Winkel C", "url": "https://webshop-c.nl/product/123", "product": "Product XL", "huidige_prijs": "149" }
]

Stap 2: Dagelijkse Schedule Trigger

Maak een n8n workflow met Schedule Trigger dagelijks om 08:00. Voeg een Google Sheets node toe die alle rijen uit het Te Monitoren tabblad leest, gevolgd door een SplitInBatches node om elke URL apart te verwerken.

// Schedule Trigger - dagelijks 08:00
{
  "rule": {
    "interval": [
      {
        "field": "cronExpression",
        "expression": "0 8 * * *"
      }
    ]
  }
}

Stap 3: Pagina ophalen via HTTP Request

Haal de HTML van de prijspagina op:

// HTTP Request node
{
  "method": "GET",
  "url": "{{ $json.url }}",
  "options": {
    "response": {
      "response": {
        "neverError": true,
        "responseFormat": "text"
      }
    },
    "timeout": 15000
  },
  "headers": {
    "User-Agent": "Mozilla/5.0 (compatible; PriceBot/1.0)"
  }
}

Stap 4: Claude extraheert de prijs

Stuur de HTML naar Claude voor prijsextractie. Geef ook het product mee zodat Claude weet waar hij naar zoekt:

{
  "model": "claude-sonnet-4-6",
  "max_tokens": 150,
  "messages": [{
    "role": "user",
    "content": "Extraheer de prijs voor '{{ $('Google Sheets').item.json.product }}' uit deze webpagina HTML.\n\nHTML (eerste 8000 tekens):\n{{ $json.data.substring(0, 8000) }}\n\nGeef ALLEEN een JSON object: { prijs: number (alleen het getal, geen euroteken), valuta: 'EUR'|'USD', periode: 'maand'|'jaar'|'eenmalig'|'onbekend', gevonden: boolean }\nAls de prijs niet gevonden is: { gevonden: false, prijs: null }"
  }]
}

Stap 5: Vergelijken met vorige prijs

Vergelijk de nieuw gevonden prijs met de opgeslagen waarde uit Google Sheets:

// Code node: prijsvergelijking
const huidigePrijs = parseFloat($('Google Sheets').item.json.huidige_prijs);
const claudeOutput = JSON.parse($('Claude Extraheer').item.json.content[0].text);
const nieuwePrijs = claudeOutput.prijs;

if (!claudeOutput.gevonden || !nieuwePrijs) {
  return [{ json: { wijziging: false, reden: 'Prijs niet gevonden' } }];
}

const wijziging = Math.abs(nieuwePrijs - huidigePrijs) > 0.01;
const percentage = ((nieuwePrijs - huidigePrijs) / huidigePrijs * 100).toFixed(1);
const richting = nieuwePrijs > huidigePrijs ? 'verhoogd' : 'verlaagd';

return [{ json: {
  wijziging,
  nieuwePrijs,
  huidigePrijs,
  percentage,
  richting,
  concurrent: $('Google Sheets').item.json.concurrent,
  product: $('Google Sheets').item.json.product
} }];

Stap 6: IF node als filter

Voeg een IF node toe die alleen doorgaat als er een wijziging is. De False-tak eindigt hier (geen actie nodig). De True-tak gaat door naar analyse en alert.

// IF node conditie
{
  "conditions": {
    "boolean": [
      {
        "value1": "={{ $json.wijziging }}",
        "value2": true
      }
    ]
  }
}

Stap 7: Claude analyseert de wijziging

Laat Claude de strategie achter de prijswijziging analyseren:

{
  "model": "claude-sonnet-4-6",
  "max_tokens": 300,
  "messages": [{
    "role": "user",
    "content": "Analyseer deze prijswijziging van een concurrent.\n\nCONCURRENT: {{ $json.concurrent }}\nPRODUCT: {{ $json.product }}\nOUDE PRIJS: EUR {{ $json.huidigePrijs }}\nNIEUWE PRIJS: EUR {{ $json.nieuwePrijs }}\nWIJZIGING: {{ $json.percentage }}% {{ $json.richting }}\n\nGeef een korte analyse (max 120 woorden):\n1. Mogelijke reden voor deze wijziging (marktdruk, kostenanpassing, strategie)\n2. Wat dit betekent voor jouw prijspositie\n3. Of je actie moet overwegen (ja/nee/afwachten) en waarom"
  }]
}

Stap 8: Alert sturen en Sheets bijwerken

Stuur de alert via Gmail en update Google Sheets tegelijk (gebruik Parallel nodes):

// Gmail alert
{
  "to": "jij@bedrijf.nl",
  "subject": "Prijswijziging gedetecteerd: {{ $('Vergelijking').item.json.concurrent }} ({{ $('Vergelijking').item.json.percentage }}%)",
  "message": "Concurrent: {{ $('Vergelijking').item.json.concurrent }}\nProduct: {{ $('Vergelijking').item.json.product }}\nOud: EUR {{ $('Vergelijking').item.json.huidigePrijs }}\nNieuw: EUR {{ $('Vergelijking').item.json.nieuwePrijs }}\nWijziging: {{ $('Vergelijking').item.json.percentage }}% {{ $('Vergelijking').item.json.richting }}\n\nCLAUDE ANALYSE:\n{{ $('Claude Analyse').item.json.content[0].text }}\n\nBekijk het prijsdashboard: [Google Sheets link]"
}

Stap 9: Google Sheets bijwerken

Update het Te Monitoren tabblad met de nieuwe prijs en voeg een rij toe aan Geschiedenis:

// Google Sheets Append Row (Geschiedenis tabblad)
{
  "sheetName": "Geschiedenis",
  "columns": {
    "Datum": "={{ $now.toISO() }}",
    "Concurrent": "={{ $('Vergelijking').item.json.concurrent }}",
    "Product": "={{ $('Vergelijking').item.json.product }}",
    "Prijs": "={{ $('Vergelijking').item.json.nieuwePrijs }}",
    "Vorige Prijs": "={{ $('Vergelijking').item.json.huidigePrijs }}",
    "Wijziging": "={{ $('Vergelijking').item.json.percentage }}%",
    "Analyse": "={{ $('Claude Analyse').item.json.content[0].text }}"
  }
}

Stap 10: Testen en activeren

Test de workflow door handmatig een andere prijs in te vullen in het Te Monitoren tabblad dan de werkelijke prijs op de website. Klik op Test Workflow. Controleer: HTTP Request haalt de HTML op, Claude extraheert de juiste prijs, de vergelijking detecteert de wijziging, de alert arriveert in Gmail, Google Sheets wordt bijgewerkt. Activeer na succesvolle test.

Troubleshooting

Probleem: HTTP Request geeft 403 Forbidden

Sommige websites blokkeren bots via robots.txt of rate limiting. Voeg realistische headers toe (User-Agent, Accept, Accept-Language) en voeg een Wait node toe van 2 tot 5 seconden tussen requests. Als de website een CAPTCHA-bescherming heeft, is scrapen niet mogelijk zonder speciale tools.

Probleem: Claude vindt de prijs niet in de HTML

Vergroot het aantal tekens dat je naar Claude stuurt (8000 naar 15000). Of gebruik een specifiekere selector: voeg een HTML Extract node toe vóór Claude die de relevante sectie van de pagina isoleert op basis van een CSS-selector als '.pricing-card' of '#price'.

Uitbreidingen

  • Voeg een Slack notificatie toe naast Gmail voor direct zichtbare alerts
  • Voeg eigen producten toe aan het systeem: monitor ook je eigen prijspagina op onbedoelde wijzigingen
  • Maak een wekelijks prijsrapport als er geen dagelijkse wijzigingen zijn: overzicht van het prijslandschap

Bedrijven die proactief prijswijzigingen van concurrenten monitoren, reageren gemiddeld 5 keer sneller op marktveranderingen dan bedrijven die dat handmatig doen of helemaal niet. In competitive markten is die reactiesnelheid direct omzet.

Gerelateerd

Nieuwsbrief

Meer handleidingen en tips?

Elke week de beste agentic AI inzichten en nieuwe handleidingen in je inbox.

Gratis aanmelden →