Inkommande text är rörig. Kontaktformulär, supportchattar, RSS-snuttar, webhook-payloads. En enda dålig prompt injection eller ett dolt script kan tyst förgifta nästa AI-steg du kör.
OpenAI Sheets logging är en räddare i nöden när du behöver fart och ett revisionsspår. Marketing Ops-team som granskar UGC märker det först. Säkerhetsmedvetna founders märker det också. Det gör även konsulter som bygger kundautomationer som inte har råd med ”överraskande” output.
Det här arbetsflödet granskar inkommande text med OpenAI, rensar den, riskpoängsätter och loggar allt till Google Sheets. Du ser var attacker stoppas, vad som saneras och vad som blockeras innan det når dina AI-verktyg.
Så fungerar den här automationen
Hela n8n-arbetsflödet, från trigger till slutoutput:
n8n Workflow Template: OpenAI + Google Sheets: säkrare textkontroller
flowchart LR
subgraph sg0["Moderate Text Flags Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Incoming Webhook Trigger"]
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Payload Data", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Moderate Text Flags", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Evaluate True Categories"]
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Verify Moderation Result", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Combine Streams"]
n6@{ icon: "mdi:robot", form: "rounded", label: "Validate Input Patterns", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Branch on Rejected", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Sanitize Content Layer", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Rejection Status", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Format Presentation", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "Final QA Readiness", pos: "b", h: 48 }
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Aggregate Results"]
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Update Output Fields", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by Decision", pos: "b", h: 48 }
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Return Webhook Reply"]
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Build Rejection Report", pos: "b", h: 48 }
n17@{ icon: "mdi:message-outline", form: "rounded", label: "Dispatch Alert Email", pos: "b", h: 48 }
n18@{ icon: "mdi:swap-vertical", form: "rounded", label: "Compose Fallback Message", pos: "b", h: 48 }
n17 --> n18
n5 --> n6
n12 --> n13
n14 --> n15
n14 --> n6
n0 --> n1
n9 --> n15
n9 --> n10
n9 --> n12
n13 --> n14
n1 --> n2
n1 --> n5
n7 --> n16
n7 --> n8
n7 --> n12
n4 --> n5
n4 --> n15
n18 --> n15
n10 --> n11
n10 --> n12
n2 --> n3
n16 --> n17
n3 --> n4
n6 --> n7
n8 --> n9
n11 --> n12
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n2,n6,n8,n10,n11 ai
class n4,n7,n9,n14 decision
class n0,n15 api
class n3 code
classDef customIcon fill:none,stroke:none
class n0,n3,n5,n12,n15 customIcon
Problemet: inkommande text kan kapa din AI
Om du kör AI på användarskapad text har du förmodligen sett det. Någon klistrar in en ”hjälpsam” instruktion som försöker skriva över din systemprompt. En annan inskickning innehåller en skum URL-förkortare. En tredje gömmer HTML i Markdown som ser ofarlig ut tills den hamnar i ett mejl, en kunskapsbas eller ett nedströms LLM-steg. Att granska allt manuellt tar tid, och det är lätt att missa den enda rad som spelar roll. Samtidigt är det värre att släppa igenom allt: du får dataläckor, trasiga outputs eller en AI-assistent som börjar följa angriparens instruktioner.
Det eskalerar snabbt. Här är var det fallerar i riktiga team.
- Manuella granskningar stjäl cirka 1–2 timmar under intensiva dagar, och det är under ”snabbskannen” som subtil prompt injection slinker igenom.
- Osäkra länkar slinker igenom, vilket innebär att du kan råka sammanfatta eller lagra innehåll som aldrig borde betraktas som tillförlitligt.
- Utan en logg kan du inte bevisa vad som hände i efterhand, så varje incident blir gissningar och fingerpekande.
- Enkla nyckelordsfilter är lätta att kringgå, och de blockerar också legitimt innehåll som råkar innehålla ”fel” fras.
Lösningen: granska, sanera, poängsätt och logga
Det här n8n-arbetsflödet fungerar som en säkerhetsmässig ”reception” för all inkommande text innan den når resten av din automation. Det startar när innehåll kommer in till en webhook-endpoint (till exempel från ett formulärverktyg, en chattplattform eller ett annat arbetsflöde). Därefter kontrollerar OpenAI texten mot riskkategorier och vanliga missbrukssignaler, och sedan letar ett andra lager efter prompt injection-mönster, skadlig formatering och misstänkta URL:er. Om innehållet är acceptabelt sanerar arbetsflödet det (tar bort farlig HTML och tveksamma protokoll), formaterar en tydlig rapport och markerar payloaden som redo för nedströms användning. Om det inte är acceptabelt skickas det till en avvisningsväg och kan larma dig via e-post så att inget farligt fortsätter i det tysta.
Arbetsflödet börjar med en inkommande webhook och mappar din payload till konsekventa fält. OpenAI utvärderar och validerar texten, sedan rensar ett saneringslager det som går att rensa på ett säkert sätt. Till sist returnerar arbetsflödet ett strukturerat svar och sparar beslutet och den sanerade texten i Google Sheets för ett tydligt revisionsspår.
Vad du får: automation vs. resultat
| Det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du hanterar 30 inkommande meddelanden per dag från ett formulär och ett webhookflöde. Manuellt blir även 4 minuter per meddelande ungefär 2 timmar av skanning, copy-paste och tvekan kring länkar. Med det här arbetsflödet skickar du texten en gång till webhooken och väntar sedan på att de automatiska kontrollerna och saneringen ska bli klara (oftast en minut eller två). Du granskar bara den lilla andel som flaggas, och allt annat är redan loggat i Google Sheets med risknoteringar.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- OpenAI för moderering, validering och formateringskontroller
- Google Sheets för att lagra beslut, poäng och sanerad text
- OpenAI API-nyckel (hämta den i OpenAI-dashboarden)
Svårighetsnivå: Medel. Du klistrar in inloggningsuppgifter, mappar en JSON-payload och justerar några promptar och tröskelvärden.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
En webhook tar emot texten. Du POST:ar JSON som { “content”: “your_text”, “source”: “identifier” } till arbetsflödets endpoint, och n8n fångar upp det direkt.
Payloaden mappas till strukturerade fält. Ett Set-steg standardiserar vad ”content” och ”source” betyder så att senare kontroller inte skapar fel när en app skickar lite andra nycklar.
OpenAI kör riskkontroller i lager. Först utvärderas och bekräftas modereringsliknande flaggor. Sedan letar en valideringspass efter prompt injection-mönster, XSS-liknande payloads, data URI-tricks och misstänkta URL:er. Vissa resultat slås ihop så att du får ett konsekvent slutbesked.
Felfritt innehåll saneras och paketeras för nedströms användning. Om det godkänns tar arbetsflödet bort farlig markup, formaterar en presentationsklar rapport och kör en sista QA-beredskapskontroll så att outputen går att använda. Om det inte godkänns bygger det en avvisningsrapport och kan skicka ett larmmejl så att den dåliga payloaden inte förblir dold.
Du kan enkelt justera avvisningströskeln för att vara striktare eller mer förlåtande utifrån dina behov. Se hela implementationsguiden nedan för alternativ för anpassning.
Steg-för-steg-guide för implementation
Steg 1: Konfigurera webhook-triggern
Konfigurera den inkommande webhooken så att externa system kan skicka innehåll för säkerhetsbearbetning och få ett svar.
- Lägg till och öppna Incoming Webhook Trigger.
- Ställ in Path på
sanity-check. - Ställ in HTTP Method på
POST. - Ställ in Response Mode på
Response Nodeså att arbetsflödet kan svara via Return Webhook Reply.
⚠️ Vanlig fallgrop: Om webhooken testas innan Return Webhook Reply är konfigurerad kan anrop hänga eftersom det saknas en responsnod.
Steg 2: Anslut OpenAI
Det här arbetsflödet använder flera OpenAI-drivna noder för klassificering, validering, sanering, formatering och QA-kontroller.
- Öppna Moderate Text Flags och välj era OpenAI API-inloggningsuppgifter.
- Öppna Validate Input Patterns, Sanitize Content Layer, Format Presentation och Final QA Readiness och anslut samma OpenAI-inloggningsuppgifter till varje nod.
Inloggningsuppgifter krävs: Anslut era openAiApi-inloggningsuppgifter
⚠️ Vanlig fallgrop: Med fem OpenAI-noder kommer en saknad inloggningsuppgift på en enda nod att bryta pipelinen—verifiera att alla är anslutna.
Steg 3: Sätt upp payload-mappning och modereringsgrind
Mappa inkommande webhook-payload, klassificera för policyöverträdelser och kombinera strömmar för efterföljande validering.
- I Map Payload Data, ställ in tilldelningen data till
{{ $json.body }}. - Konfigurera Moderate Text Flags med Operation satt till
classifyoch Input till=. - Bekräfta att Evaluate True Categories innehåller den medföljande JavaScript-koden som kontrollerar modereringskategorier och returnerar
statusochviolations. - Ställ in Verify Moderation Result för att kontrollera att
{{ $json.status }}är lika medsuccess. - Säkerställ att Combine Streams har Mode satt till
combineoch Combine By satt tillcombineByPosition.
Map Payload Data skickar utdata parallellt till både Moderate Text Flags och Combine Streams.
Steg 4: Konfigurera pipeline för validering, sanering och formatering
Använd AI-noder för att validera input, sanera osäkert innehåll, formatera output och köra slutlig QA innan aggregering.
- I Validate Input Patterns, behåll JSON Output aktiverat och skicka användarmeddelandet med
{{ $json.data.message }}. - Ställ in Branch on Rejected så att den jämför att
{{ $json.message.content.status }}är lika medREJECTED. - I Sanitize Content Layer, använd
{{ $json.message.content.validated_input }}som input och behåll JSON Output aktiverat. - Ställ in Check Rejection Status så att den utvärderar att
{{ $json.message.content.status }}är lika medREJECTED. - I Format Presentation, ange
{{ $json.message.content.sanitized_content }}som input och behåll JSON Output aktiverat. - I Final QA Readiness, ange
{{ $json.message.content.encoded_output }}som input och behåll JSON Output aktiverat.
Format Presentation skickar utdata parallellt till både Final QA Readiness och Aggregate Results.
Steg 5: Konfigurera aggregering och routningslogik
Aggregera resultat, uppdatera utdatafält och routa beslut till antingen svar eller ombearbetning.
- I Aggregate Results, ställ in Mode på
combine, Combine By påcombineByPositionoch Number Inputs på4. - I Update Output Fields, mappa alla fält med uttryck som
{{ $json.message.content.action }},{{ $json.message.content.sanitized_content }}samt rapportfälten som visas i noden. - I Route by Decision, konfigurera regler för att kontrollera att
{{ $json.message.content.status }}är lika medDELIVER,ESCALATE_REVIEWellerREPROCESS. - Säkerställ att Route by Decision skickar utdata till Return Webhook Reply för levererade/eskalerade resultat och tillbaka till Validate Input Patterns för ombearbetning.
⚠️ Vanlig fallgrop: Felkonfigurerade statussträngar i Route by Decision kan routa giltiga objekt tillbaka till Validate Input Patterns och skapa loopar.
Steg 6: Konfigurera avvisningsrapportering och e-postaviseringar
När innehåll avvisas, sammanställ en rapport och avisera ert team via e-post, och returnera sedan ett reservsvar.
- I Build Rejection Report, mappa fält med uttryck som
{{ $json.message.content.threat_assessment }}och{{ $json.message.content.critical_findings }}. - Öppna Dispatch Alert Email och ställ in To Email på
{{ toEmail }}och From Email på{{ fromEmail }}. - Ställ in Subject på
{{ $json.message.input.threat_assessment.rejection_reason }}. - Använd de medföljande HTML- och Text-kropparna med uttryck som
{{ $('Incoming Webhook Trigger').item.json.headers['cf-connecting-ip'] }}och{{ $('Incoming Webhook Trigger').item.json.webhookUrl }}. - I Compose Fallback Message, ställ in aiResponse till
Unable to process your request at this time. Please try again later..
Inloggningsuppgifter krävs: Anslut era smtp-inloggningsuppgifter
Steg 7: Testa och aktivera ert arbetsflöde
Validera arbetsflödet end-to-end och aktivera det för produktionsanvändning.
- Klicka på Execute Workflow och skicka en POST-förfrågan till Incoming Webhook Trigger-URL:en med ett
body.message-fält. - Bekräfta att lyckade körningar returnerar data från Return Webhook Reply som innehåller uppdaterade fält från Update Output Fields.
- Skicka en test-payload som ska avvisas och verifiera att Build Rejection Report triggar Dispatch Alert Email, följt av Compose Fallback Message.
- När allt är verifierat, växla arbetsflödet till Active för att aktivera bearbetning i produktion.
Vanliga fallgropar
- OpenAI-inloggningar kan löpa ut eller slå i användningsgränser. Om saker slutar fungera, kontrollera först dina credential-inställningar i n8n och OpenAI:s användningsdashboard.
- Om du använder Wait-noder eller extern rendering varierar bearbetningstiderna. Öka väntetiden om nedströms noder fallerar på tomma svar.
- Behörigheter i Google Sheets kan vara förvånansvärt strikta när du byter konto. Om rader slutar loggas, bekräfta att arket är delat med samma Google-användare som är ansluten i n8n.
Vanliga frågor
Cirka 30 minuter om din åtkomst till OpenAI och Google Sheets är klar.
Nej. Du kopplar främst konton och justerar några promptar och fältmappningar.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna in OpenAI API-kostnader, som vanligtvis är några cent per batch av kontroller beroende på hur mycket text du processar.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och hanterar n8n bra. Self-hosting ger dig obegränsat antal körningar men kräver grundläggande serverhantering.
Ja, och det bör du. Skärp trösklarna i switchen ”Route by Decision”, justera promptarna i ”Validate Input Patterns” och ”Sanitize Content Layer” så att de matchar din policy, och lägg till extra URL-regler om din bransch blockerar förkortare eller vissa domäner. Många team skriver också ett fält för ”beslutsorsak” i Google Sheets så att granskare ser exakt varför något avvisades.
Oftast beror det på en ogiltig eller utgången API-nyckel i din OpenAI-credential i n8n. Det kan också vara ett fakturerings- eller kvotproblem på ditt OpenAI-konto, eller en modellbehörighetskonflikt om din workspace begränsar vissa modeller. Om felen bara sker på stora payloads, minska inputstorleken eller trunkera innehållet innan OpenAI-noderna.
Om du self-hostar n8n finns ingen fast körningsgräns (det beror främst på din server och OpenAI:s rate limits).
Det beror på hur säkerhetsinriktat du behöver göra det. Det här arbetsflödet använder flera OpenAI-kontroller, slår ihop resultat och routar olika utfall, vilket är precis där n8n ofta känns renare och mer kontrollerbart än en enkel 2-stegs Zap. Self-hosting är också viktigt om du vill ha obegränsade körningar och tajtare kontroll över dataflödet. Zapier eller Make kan fortfarande vara helt okej om du bara behöver en lättare innehållskontroll och en enda ”logga till sheet”-åtgärd. Om du vill ha hjälp att välja, prata med en automationsexpert.
Det här är den typen av arbetsflöde du sätter upp en gång och sedan förlitar dig på tyst varje dag. De repetitiva kontrollerna sker automatiskt, och du har ett tydligt underlag i Google Sheets när någon frågar: ”Hur kunde det här slinka igenom?”
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.