Handleidingen · n8n

Sociale media advertenties automatisch genereren met Claude en n8n

Sociale media-advertenties automatisch schrijven met Claude en n8n. Varianten, targeting-notes en planning. Nederlandse MKB-stappen.

🟡 Gevorderd — beetje technisch ⏱ 75 minuten
Tools: Clauden8nMeta Ads APIGoogle Sheets
Sociale media advertenties automatisch genereren met Claude en n8n cover

Advertentieteksten schrijven voor meerdere platformen is repetitief werk: Facebook wil kort en pakkend, LinkedIn wil zakelijk en onderbouwd, Instagram draait om visuele haak en emotie. Voor elke campagne schrijf je eigenlijk drie sets teksten voor hetzelfde product. Met Claude en n8n automatiseer je dat proces volledig.

In deze handleiding bouw je een workflow waarbij je een productomschrijving en doelgroep invoert in Google Sheets, waarna n8n automatisch per platform geoptimaliseerde advertentieteksten genereert via Claude en ze opslaat klaar voor gebruik.

Wat je nodig hebt

  • n8n (cloud of self-hosted)
  • Claude API key (Anthropic Console)
  • Google Sheets (invoer van producten en uitvoer van teksten)
  • Google account voor Google Sheets API

Stap 1: Google Sheet inrichten

Maak een Google Sheet aan met twee tabbladen: 'Invoer' en 'Advertenties'. Het Invoer-tabblad heeft deze kolommen:

  • Kolom A: Product/dienst naam
  • Kolom B: Productomschrijving (max 200 woorden)
  • Kolom C: Doelgroep (bijv. 'MKB-ondernemers 35-55, Noord-Holland')
  • Kolom D: USPs (kommagescheiden, max 5)
  • Kolom E: Status (leeg = wacht op verwerking, 'Verwerkt' = klaar)

Stap 2: n8n Schedule Trigger

Maak een nieuwe n8n workflow met een Schedule Trigger die elk uur draait. De workflow checkt of er nieuwe rijen zonder status zijn in het Invoer-tabblad.

# Cron expressie: elk uur
0 * * * *

Stap 3: Google Sheets uitlezen

Voeg een Google Sheets Read Rows node toe. Configureer hem om alle rijen te lezen uit het Invoer-tabblad. Daarna voeg je een Filter node toe die alleen rijen doorlaat waarbij kolom E (Status) leeg is:

// Filter: alleen rijen zonder status
{{ $json['Status'] === '' || $json['Status'] === undefined }}

Stap 4: Claude prompt voor Facebook

Voeg een HTTP Request node toe voor de Claude API. Gebruik dit platform-specifieke prompt voor Facebook:

{
  "model": "claude-sonnet-4-6",
  "max_tokens": 800,
  "messages": [{
    "role": "user",
    "content": "Schrijf 3 varianten van een Facebook advertentie voor:\n\nProduct: {{ $json['Product'] }}\nOmschrijving: {{ $json['Omschrijving'] }}\nDoelgroep: {{ $json['Doelgroep'] }}\nUSPs: {{ $json['USPs'] }}\n\nRegels Facebook:\n- Primaire tekst: max 125 tekens\n- Kop: max 40 tekens, pakkend en actiegericht\n- Call-to-action: gebruik een van: Meer informatie, Aanmelden, Kopen, Gratis proefperiode\n- Emoji mogen (max 2 per advertentie)\n- Informeel maar professioneel\n\nGeef output als JSON array met 3 objecten elk met: primaireTekst, kop, cta"
  }]
}

Stap 5: LinkedIn en Instagram varianten

Voeg twee identieke HTTP Request nodes toe parallel aan de Facebook node, maar met platform-specifieke prompts. LinkedIn prompt:

{
  "model": "claude-sonnet-4-6",
  "max_tokens": 800,
  "messages": [{
    "role": "user",
    "content": "Schrijf 2 varianten van een LinkedIn Sponsored Content advertentie voor:\n\nProduct: {{ $json['Product'] }}\nOmschrijving: {{ $json['Omschrijving'] }}\nDoelgroep: {{ $json['Doelgroep'] }}\nUSPs: {{ $json['USPs'] }}\n\nRegels LinkedIn:\n- Introductietekst: 150-300 tekens, zakelijk en data-gedreven\n- Kop: 70 tekens max, ROI of resultaat benadrukken\n- Geen emoji\n- Toon: expert, vertrouwenwekkend\n\nOutput als JSON array met 2 objecten: introductie, kop, cta"
  }]
}

Stap 6: Resultaten samenvoegen

Voeg een Merge node toe (type: Merge by Position) om de drie Claude outputs samen te voegen. Daarna een Code node die alles combineert in een overzichtelijk object:

const facebook = JSON.parse($input.all()[0].json.content[0].text.replace(/```json\n?/g,'').replace(/```/g,'').trim());
const linkedin = JSON.parse($input.all()[1].json.content[0].text.replace(/```json\n?/g,'').replace(/```/g,'').trim());
const instagram = JSON.parse($input.all()[2].json.content[0].text.replace(/```json\n?/g,'').replace(/```/g,'').trim());

return [{
  json: {
    facebook: JSON.stringify(facebook),
    linkedin: JSON.stringify(linkedin),
    instagram: JSON.stringify(instagram)
  }
}];

Stap 7: Opslaan in Advertenties-tabblad

Voeg een Google Sheets Append Row node toe voor het Advertenties-tabblad. Map de velden:

{
  "spreadsheetId": "YOUR_SHEET_ID",
  "sheetName": "Advertenties",
  "columns": {
    "Datum": "={{ $now.format('YYYY-MM-DD') }}",
    "Product": "={{ $('Google Sheets').item.json['Product'] }}",
    "Facebook varianten": "={{ $json.facebook }}",
    "LinkedIn varianten": "={{ $json.linkedin }}",
    "Instagram varianten": "={{ $json.instagram }}"
  }
}

Stap 8: Status updaten

Markeer de verwerkte rij als 'Verwerkt' in het Invoer-tabblad zodat de workflow hem niet opnieuw oppakt. Gebruik een Google Sheets Update Row node met de rij-index uit de originele trigger:

{
  "spreadsheetId": "YOUR_SHEET_ID",
  "sheetName": "Invoer",
  "rowNumber": "={{ $('Google Sheets').item.json.row_number }}",
  "columns": {
    "Status": "Verwerkt - {{ $now.format('DD-MM-YYYY HH:mm') }}"
  }
}

Stap 9: Notificatie naar marketeer

Stuur een e-mail of Slack bericht zodra advertentieteksten klaar zijn. Voeg een Gmail of Slack node toe als laatste stap:

{
  "to": "marketing@jouwbedrijf.nl",
  "subject": "Advertentieteksten klaar: {{ $('Google Sheets').item.json['Product'] }}",
  "text": "De advertentieteksten voor {{ $('Google Sheets').item.json['Product'] }} zijn gegenereerd en staan klaar in Google Sheets.\n\nBekijk ze hier: https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID"
}

Stap 10: Testen

Voeg een testrij toe aan het Invoer-tabblad en klik op 'Test Workflow'. Controleer of alle drie platforms output produceren en of de JSON correct geparsed wordt. Controleer het Advertenties-tabblad op inhoud en de Status-kolom in het Invoer-tabblad op de 'Verwerkt' melding.

Troubleshooting

Probleem: Claude geeft geen valide JSON

Voeg aan elk prompt toe: 'Geef ALLEEN het JSON object, geen uitleg of markdown omheen.' Als het blijft, gebruik een Try/Catch in de Code node en log de ruwe output voor debugging.

Probleem: Workflow verwerkt rijen dubbel

Dit treedt op als de Status-update langzamer is dan de volgende trigger. Voeg een wachttijd van 5 seconden toe tussen de verwerking en de volgende run, of gebruik een aparte vergrendeling via een n8n variabele.

Uitbreidingen

  • Voeg een A/B test variant toe: laat Claude ook een 'challenger' variant genereren die een andere emotionele haak gebruikt
  • Koppel aan de Meta Ads API om advertenties direct te publiceren als concept in Ads Manager
  • Laat Claude ook afbeeldingsrichtlijnen genereren (kleuren, sfeer, compositie) die je aan een designer of AI-beeldgenerator doorgeeft
  • Voeg prestatiesdata toe: koppel Meta Insights API en laat Claude leren welke tekstvarianten historisch het beste presteren

Met deze workflow lever je per product in 5 tot 10 minuten professionele advertentieteksten voor drie platformen. Wat vroeger een dag werk was voor een copywriter, is nu input voor een korte review door de marketeer. De creatieve beoordeling blijft menselijk: de productie is AI.

Gerelateerd

Nieuwsbrief

Meer handleidingen en tips?

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

Gratis aanmelden →