I denne guide bygger du et n8n workflow, der henter emner fra Google Sheets, beder Claude om at skrive et udkast og gemmer resultatet i et nyt ark, klar til gennemsyn. Det er samme mønster, som jeg har brugt i et AI-drevet content-workflow for en kunde. Her viser jeg det med et fiktivt eksempel, så du kan følge med og bygge din egen version, uanset hvilken type indhold du arbejder med.
Kort fortalt
- Workflowet har syv noder: Trigger, Google Sheets, Loop Over Items, to Code-noder, HTTP Request og Google Sheets igen.
- Regler for tone, målgruppe og brand ligger adskilt fra selve logikken, så de kan ændres uden at røre workflowet.
- Claude kaldes via HTTP Request-noden, så samme opsætning virker med andre AI-udbydere.
- Alt output lander i et separat ark til gennemsyn. Intet går direkte i produktion.
Før du starter
Guiden er ikke for helt nye brugere. Du behøver ikke kunne programmere, for hvert stykke kode bliver forklaret, men du skal være tryg ved at læse og tilpasse lidt JavaScript. Du skal have:
- n8n kørende. Har du ikke det endnu, så følg guiden til at installere n8n med Docker.
- Kendskab til n8n’s dashboard, og til forskellen på et gemt og et publiceret workflow. Det gennemgår jeg i guiden til n8n i hverdagen.
- En Google-konto, som n8n kan forbinde til Google Sheets med.
- En API-nøgle fra Anthropic Console. Du betaler efter forbrug, så sæt gerne en forbrugsgrænse, før du begynder at teste.
Tidsforbrug: Cirka 45 til 60 minutter, inklusive demo-data og test af hvert trin.
Det lærer du i denne guide
- At forbinde n8n til Google Sheets som både datakilde og output
- At bygge en dynamisk prompt ud fra data i en række med JavaScript
- At kalde Claude API direkte via en HTTP Request-node
- At hente teksten ud af et API-svar i JSON
- At holde regler for tone og brand adskilt fra workflowets logik
Sådan hænger n8n workflowet sammen
Workflowet består af syv noder, der hver har én opgave:
| Node | Opgave |
|---|---|
| 1. Manual Trigger | Starter workflowet, mens du bygger og tester |
| 2. Google Sheets | Henter de rækker, der er klar til produktion |
| 3. Loop Over Items | Sender én række ad gangen videre |
| 4. Code | Bygger prompten ud fra rækkens data og dine regler |
| 5. HTTP Request | Sender prompten til Claude API |
| 6. Code | Henter selve teksten ud af Claudes svar |
| 7. Google Sheets | Skriver udkastet i et separat ark til gennemsyn |
Automatisering af indhold handler ikke om at fjerne skribenten. Det handler om at fjerne de gentagne dele af arbejdet, som research-opsamling, første udkast og formatering, så tiden går til det, der kræver et menneske: vurdering, finpudsning og godkendelse. Derfor bygger jeg altid disse workflows efter tre principper:
- Konteksten (brand, tone og regler) ligger ét sted og genbruges automatisk.
- Output går altid til gennemsyn, aldrig direkte i produktion.
- Opsætningen skal være så gennemsigtig, at andre end mig selv kan forstå og justere den.
Hvorfor bygge et AI-workflow i n8n?
n8n er visuelt og node-baseret. Du bygger workflowet ved at forbinde bokse i stedet for at skrive et program fra bunden, og du kan se hele logikken på én gang. Det er en stor fordel, når en automation skal forklares og overdrages til folk, der ikke selv koder. n8n er open source, kan køre på din egen computer eller server, og har færdige integrationer til de fleste værktøjer, en marketingafdeling bruger, fx Google Sheets, Google Docs, Slack og e-mail.
De tre tjenester i workflowet har hver sin rolle:
- Google Sheets er indgangen. Jeg vælger bevidst et regneark frem for en database, fordi alle på et marketingteam kan udfylde det. Det kræver ingen kode og ingen særlig adgang, bare en kolonne at skrive et emne i.
- Google Docs bruges til alt, der er for langt til en celle: brand-retningslinjer, tone of voice og eventuelle compliance-regler.
- Claude API fra Anthropic skriver selve udkastet. Den kaldes via n8n’s generelle HTTP Request-node. Det gør opsætningen gennemsigtig og betyder, at du nemt kan skifte til en anden AI-udbyder senere.
Hvilke ark og dokumenter skal du bruge?
| Dokument | Rolle |
|---|---|
| Emner (Google Sheets) | Arbejdskøen. Én række pr. stykke indhold med kolonnerne Emne, Målgruppe og Status. |
| Genereret indhold (Google Sheets) | Destinationen. Her lander udkastene, adskilt fra råmaterialet. |
| Kontekst (Google Docs) | Fast viden, som AI-modellen skal bruge hver gang: brand, tone, målgruppe og regler. |
Opdelingen er et princip lånt fra softwareudvikling: Hold reglerne (konfigurationen) adskilt fra mekanikken (logikken). Når nogen på teamet ændrer en retningslinje, opdaterer de ét dokument og ikke hver eneste prompt. I denne guide skriver vi reglerne direkte i Code-noden for at holde det enkelt. Når du er klar, kan du flytte dem til et Google Docs-dokument og hente dem med en Google Docs-node.
Kort om JSON i n8n
Alle noder i n8n sender data videre som JSON, altså strukturerede pakker med navngivne felter, fx {"Emne": "5 tips til…", "Status": "Klar"}. Når du ser .json i koden herunder, henviser det til den datapakke og ikke til en fil. Forstår du det ene begreb, er resten af koden meget lettere at følge.
Byg dit n8n workflow node for node
1. Manual Trigger: Start workflowet manuelt
Start med en Manual Trigger, mens du bygger og tester. Når workflowet virker, kan du skifte den ud med en Schedule Trigger, så det kører automatisk, fx hver morgen. Husk, at workflowet først kører på sin trigger, når det er publiceret.
2. Google Sheets: Hent rækker, der er klar
Tilføj en Google Sheets-node med handlingen Get row(s) in sheet, og vælg dit Emner-ark. Tilføj et filter, så kun rækker med Status = “Klar” bliver hentet. Så behandler workflowet kun det, der faktisk skal produceres.
I mit demo-ark ser en række sådan ud:
| Emne | Målgruppe | Status |
|---|---|---|
| 5 tips til bedre kaffebrygning derhjemme | Kaffeentusiaster, nybegyndere | Klar |
3. Loop Over Items: Behandl én række ad gangen
n8n kører som udgangspunkt hver node én gang for hver række, den modtager. Med mange rækker sender HTTP Request-noden derfor mange kald til Claude på én gang, og det kan ramme API’ets grænser for antal kald. Loop Over Items (tidligere Split In Batches) giver dig kontrol: Sæt Batch Size til 1, så behandles én række ad gangen.
Noden har to udgange: loop og done. Resten af workflowet skal forbindes til loop, og den sidste node skal forbindes tilbage til Loop Over Items, så næste række bliver hentet. Det er en af de mest almindelige begynderfejl. Jeg gennemgår den sammen med andre typiske problemer i 9 n8n workflow fejl fra et AI-content-projekt.
4. Code: Byg prompten
Tilføj en Code-node, og sæt Mode til Run Once for Each Item. Noden samler rækkens data med de regler, Claude skal følge. Det er her, du bestemmer tone, målgruppe og hvad der må og ikke må siges.
const row = $input.item.json;
const prompt = `Skriv en kort artikelintro om: ${row['Emne']}
Målgruppe: ${row['Målgruppe']}
Tone: Venlig, konkret, ingen overdrevne løfter.`;
return { json: { prompt } };
Tre ting er værd at forstå i koden:
$input.item.jsonhenter den aktuelle rækkes data.${row['Emne']}indsætter værdien fra kolonnen Emne direkte i teksten. Det er sådan, rækkens indhold bliver flettet sammen med din faste instruktion.returnsender resultatet videre til næste node. Glemmer du den linje, modtager næste node ingenting.
5. HTTP Request: Kald Claude API
En API er en aftalt måde for to systemer at tale sammen på. Du sender en forespørgsel til Anthropics server med to dele: headers, der fortæller, hvem du er, og body, der indeholder selve beskeden. Indstil HTTP Request-noden sådan:
- Method: POST
- URL:
https://api.anthropic.com/v1/messages - Authentication: Opret en credential af typen Header Auth med navnet
x-api-keyog din API-nøgle som værdi. Så ligger nøglen krypteret i n8n og ikke i selve workflowet. - Headers:
anthropic-versionmed værdien2023-06-01. - Body: JSON, som vist herunder.
{
"model": "claude-sonnet-5-5",
"max_tokens": 1024,
"messages": [
{ "role": "user", "content": {{ JSON.stringify($json.prompt) }} }
]
}
Bemærk to detaljer. Header-navnet skal være præcis x-api-key og ikke Authorization, som mange andre API’er bruger. Og prompten indsættes med JSON.stringify uden anførselstegn omkring. Ellers går JSON’en i stykker, så snart prompten indeholder anførselstegn eller linjeskift. Modelnavnet ændrer sig, når der kommer nye modeller, så tjek den aktuelle liste i Anthropics API-dokumentation.
n8n har også en indbygget Anthropic-node med handlingen Message a model. Den er hurtigere at sætte op. Jeg bruger HTTP Request her, fordi du ser præcis, hvad der bliver sendt, og fordi mønsteret virker med enhver AI-udbyder.
6. Code: Hent teksten ud af svaret
Claudes svar kommer ikke tilbage som ren tekst, men som en JSON-struktur, hvor selve teksten ligger i content[0].text. Tilføj en ny Code-node, også med Run Once for Each Item, der henter teksten ud og samler den med emnet fra den oprindelige række:
const svar = $input.item.json;
const tekst = svar.content?.[0]?.text ?? '';
const emne = $('Loop Over Items').item.json['Emne'];
return { json: { emne, tekst } };
$('Loop Over Items') henter data fra noden med det navn. Har du omdøbt noden, skal navnet i koden rettes til.
7. Google Sheets: Skriv resultatet
Tilføj en Google Sheets-node med handlingen Append row in sheet, og vælg dit ark “Genereret indhold”. Skriv emnet og teksten i hver sin kolonne, og sæt Status til “Til gennemsyn”. Forbind derefter noden tilbage til Loop Over Items.
Et godt tip: Tilføj en ekstra Google Sheets-node, der opdaterer Status i Emner-arket til “Genereret”. Så bliver den samme række ikke behandlet igen, næste gang workflowet kører.
Hvorfor dele det op i flere noder?
Det kan være fristende at samle det hele i én stor prompt i én node. Jeg deler det bevidst op af to grunde:
- Du kan fejlsøge hvert trin for sig. Ser outputtet forkert ud, kan du se præcis, om problemet ligger i data-hentningen, prompten, API-kaldet eller udtrækket af teksten.
- Reglerne bliver synlige. Når tone, målgruppe og begrænsninger ligger i deres egen node, kan du opdatere dem ét sted uden at lede i en lang tekststreng.
Næste niveau: Indbygget kvalitetskontrol
I det rigtige workflow, jeg byggede for min kunde, tilføjede jeg et ekstra lag efter genereringen: en node, der scanner outputtet for udsagn, som kræver dokumentation, før de må publiceres. Det er relevant i brancher med regler for markedsføring, fx kosttilskud. Noden virker efter samme princip som resten af workflowet. En Code-node leder efter bestemte mønstre og sender outputtet videre til enten “klar til publicering” eller “kræver manuelt tjek”.
Pointen rækker ud over den ene branche. Jo mere reguleret eller brandfølsomt jeres indhold er, jo mere får I ud af at bygge kontrollen ind i workflowet i stedet for at stole på, at nogen husker at tjekke bagefter.
Næste skridt
Workflowet her dækker det grundlæggende mønster. Vil du videre, er de naturlige næste skridt at tilføje en Switch-node, der sender forskellige typer indhold forskellige veje, at hente reglerne fra et Google Docs-dokument og at bygge et kvalitetstjek som beskrevet ovenfor.
I n8n workflow arkitektur: Designvalg bag et AI-content-system gennemgår jeg, hvordan det fulde system er bygget op, og hvorfor. Og går noget galt undervejs, finder du sandsynligvis løsningen i de 9 n8n workflow fejl, jeg selv stødte på.
Ofte stillede spørgsmål
Skal jeg bruge HTTP Request eller n8n’s Anthropic-node?
Begge virker. Anthropic-noden er hurtigst at sætte op. HTTP Request giver fuld kontrol over, hvad der bliver sendt, og samme opsætning kan bruges til andre AI-udbydere.
Hvad koster det at bruge Claude API i n8n?
n8n er gratis, når du selv kører det. Claude API betales efter forbrug, målt i tokens, og prisen afhænger af modellen. Se de aktuelle priser hos Anthropic, og sæt en forbrugsgrænse i Anthropic Console, mens du tester.
Kan jeg bruge mønsteret med andre AI-modeller end Claude?
Ja. Strukturen er den samme: hent data, byg kontekst, kald API’et, hent teksten ud og skriv den tilbage. Det er kun URL, headers og formatet på body og svar, der ændrer sig.
Hvor svært er det at tilføje et compliance-tjek?
Det afhænger af reglerne. En simpel version, der leder efter bestemte ord eller vendinger, kan klares i en Code-node. Mere nuancerede vurderinger kræver typisk endnu et AI-kald, der vurderer udkastet ud fra jeres regler.
