Din AI-agent levererar. Loggarna gör det inte. De fastnar i Postgres, är svåra att överblicka, jobbiga att dela, och varje “snabb genomgång” blir till SQL, exporter och ett kalkylark som fortfarande behöver efterarbete.
Den här automationen för Postgres Sheets transcripts träffar produktchefer först, eftersom de snabbt behöver se mönster. Men supportansvariga som jagar “vad hände egentligen?” och marknadsförare som vill granska kundernas faktiska språk märker det också. Du får felfria, delningsbara transkript i Google Sheets, organiserade per session.
Nedan ser du exakt hur flödet flyttar data från din chatthistoriktabell till en flik per session, vad du behöver för att köra det och var team oftast går fel.
Så fungerar den här automationen
Hela n8n-flödet, från trigger till slutresultat:
n8n Workflow Template: Postgres till Google Sheets: chattloggar i flikar
flowchart LR
subgraph sg0["When clicking ‘Test workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
n2["<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/postgres.svg' width='40' height='40' /></div><br/>Get conversations by sessionId"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Duplicate template sheet"]
n4@{ icon: "mdi:database", form: "rounded", label: "Clear Sheet Content", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Rename Sheet"]
n6@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set session_id", pos: "b", h: 48 }
n8["<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/postgres.svg' width='40' height='40' /></div><br/>Postgres - Get session ids"]
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Session IDs", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Add conversations", pos: "b", h: 48 }
n5 --> n7
n7 --> n4
n6 --> n8
n10 --> n9
n4 --> n2
n4 --> n3
n9 --> n4
n3 --> n5
n8 --> n9
n2 --> n10
n0 --> n8
end
subgraph sg1["Flow 2"]
direction LR
n1["<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/postgres.svg' width='40' height='40' /></div><br/>add create_at column"]
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 n0,n6 trigger
class n2,n4,n8,n10,n1 database
class n3,n5 api
classDef customIcon fill:none,stroke:none
class n2,n3,n5,n8,n1 customIcon
Problemet: chatttranskript sitter fast i databasen
När dina agentkonversationer ligger i Postgres (eller Supabase) är datan tekniskt säker, men i praktiken osynlig. En produktchef vill granska fem sessioner inför ett roadmap-möte. En supportansvarig behöver en “dålig” konversation för att träna teamet. Någon kör en fråga, exporterar CSV, klistrar in i Sheets och slösar sedan tid på att fixa tidsstämplar, sortera meddelanden och dela upp sessioner i separata flikar. Och nästa dag gör du det igen eftersom loggarna har ändrats.
Det blir mycket väldigt snabbt. Friktionen byggs på.
- Att hämta sessionsloggar manuellt innebär oftast minst 30 minuter av fråga, export och formatering per förfrågan.
- Meddelanden granskas i fel ordning, eftersom en CSV-export inte “känns” som en konversation.
- Att dela rå databasåtkomst är inget alternativ för de flesta team, så granskningar fastnar hos den som kan köra SQL.
- När folk börjar copy-pasta smyger små fel in och du tappar förtroendet för det du tittar på.
Lösningen: exportera varje session till en egen flik i Google Sheets
Det här flödet hämtar konversationshistorik från din n8n_chat_histories-tabell i Postgres och gör den till något hela teamet faktiskt kan använda. Det startar enligt schema (dagligen är vanligt) eller med en manuell körning när du behöver det nu. Först samlar det in de unika session_id-värdena så det vet vilka konversationer som finns. Sedan loopar det igenom sessionerna en i taget, rensar motsvarande flik om den redan finns, duplicerar en mallflik, döper om den till sessions-ID:t och lägger till hela meddelandehistoriken som strukturerade rader. Slutresultatet är ett Google Sheet där varje session är ett dedikerat, lättläst transkript.
Flödet startar när schematriggaren kör (eller när du klickar på manuell körning). Postgres-frågor hämtar sessions-ID:n och sedan meddelanden för varje session. Till sist byggs Google Sheets om så att transkriptet alltid är aktuellt, utan att du rör CSV-filer.
Det du får: automation vs. resultat
| Vad det här flödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att din agent har cirka 40 sessioner per dag och att varje session har 15–30 meddelanden. Manuellt blir till och med “bara att ta några exempel” ofta 10 minuter per session mellan att fråga, exportera, dela upp och formatera, så du kan bränna cirka 6 timmar på en vecka utan att märka det. Med det här flödet lägger du kanske 10 minuter en gång på att sätta upp Sheet-mallen och behörigheter, och sedan körs den dagliga körningen automatiskt. Du öppnar Google Sheets och flikarna finns redan där, döpta efter sessions-ID, redo att granskas.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Self-hosting-alternativ om du föredrar det (Hostinger fungerar bra)
- Postgres för att lagra chattminnesloggar i en tabell.
- Google Sheets för att granska transkript i delade flikar.
- Google OAuth-uppgifter (skapa i Google Cloud Console, anslut sedan i n8n).
Kunskapsnivå: Medel. Du kopplar databasuppgifter, sätter upp Google-autentisering och justerar en SQL-fråga om ditt schema skiljer sig.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Ett schema (eller manuell körning) sätter igång. Du kan köra det dagligen vid lunch, varje timme eller bara när du behöver en färsk uppsättning transkript inför ett möte.
Sessions-ID:n hämtas från Postgres. Flödet frågar din n8n_chat_histories-tabell för att få unika session_id-värden och loopar sedan igenom dem så att varje konversation hanteras konsekvent.
Varje session får en egen flik. Med en mallflik i Google Sheets duplicerar flödet den, döper om den till sessions-ID:t (via en HTTP-begäran till Sheets API) och rensar sedan eventuella gamla rader så att transkriptet byggs om strukturerat.
Meddelanden läggs till som läsbara rader. För varje session hämtar en andra Postgres-fråga meddelanden, och Google Sheets lägger sedan till dem med kolumner som Vem (user/assistant), Meddelande och Datum (formaterat från created_at).
Du kan enkelt ändra vad som identifierar en “session” till att gruppera på något mer beständigt som user_id beroende på dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: konfigurera den manuella triggern
Det här arbetsflödet kan startas manuellt eller enligt ett schema, så konfigurera båda triggers så att de matchar era operativa behov.
- Lägg till noden Manual Launch Trigger för att möjliggöra körningar vid behov.
- Lägg till noden Scheduled Run Trigger och ställ in schemaregeln så att den körs vid
12(timkonfiguration använder triggerAtHour =12). - Säkerställ att både Manual Launch Trigger och Scheduled Run Trigger är kopplade till Retrieve Session IDs.
Steg 2: anslut Postgres
Dessa noder frågar och underhåller er tabell med sessionshistorik i Postgres.
- Öppna Retrieve Session IDs och bekräfta att Query är satt till
select distinct(session_id) from n8n_chat_historiesmed Operation satt tillexecuteQuery. - Öppna Fetch Session Messages och ställ in Table till
n8n_chat_histories, Schema till=public, och lägg till ett Where-villkor: Column =session_id, Value ={{ $('Iterate Session List').item.json.session_id }}. - Om ni planerar att köra det valfria underhållet, konfigurera Utility: Add Created Timestamp med frågan
ALTER TABLE ONLY "n8n_chat_histories" ADD COLUMN "created_at" TIMESTAMP DEFAULT NOW();. - Credential Required: Anslut era
postgres-inloggningsuppgifter till Retrieve Session IDs, Fetch Session Messages och Utility: Add Created Timestamp.
Steg 3: anslut Google Sheets
Dessa noder förbereder och uppdaterar en flik i arket för varje session i ert kalkylblad för konversationslogg.
- I Purge Sheet Rows ställer ni in Document ID till ert kalkylblads-ID (ersätt
[YOUR_ID]), Sheet Name till{{ $json.session_id }}och Range tillA2:C10000. - I Clone Template Tab ställer ni in URL till
=https://sheets.googleapis.com/v4/spreadsheets/{{ $('Purge Sheet Rows').params.documentId.value }}/sheets/0:copyTooch säkerställ att body-parametern destinationSpreadsheetId är{{ $('Purge Sheet Rows').params.documentId.value }}. - I Retitle Sheet Tab ställer ni in URL till
=https://sheets.googleapis.com/v4/spreadsheets/{{ $('Purge Sheet Rows').params.documentId.value }}:batchUpdateoch JSON Body till{ "requests": [{ "updateSheetProperties": { "properties": { "sheetId": {{ $json.sheetId }}, "title": "{{ $('Purge Sheet Rows').item.json.session_id }}", "hidden": false }, "fields": "title, hidden" } }] }. - Credential Required: Anslut era
googleSheetsOAuth2Api-inloggningsuppgifter till Purge Sheet Rows, Clone Template Tab och Retitle Sheet Tab.
[YOUR_ID] kommer arbetsflödet att misslyckas när flikar rensas och kopieras.Steg 4: konfigurera sessionsbearbetning
Det här steget batchar sessions-ID:n, skapar/byter namn på flikar och sätter sessionskontexten för nedströmsnoder.
- Konfigurera Iterate Session List för att bearbeta batchar från Retrieve Session IDs (standardinställningarna räcker).
- I Assign Session Identifier lägger ni till en tilldelning med namnet session_id med värdet
{{ $('Purge Sheet Rows').first().json.session_id }}. - Bekräfta flödet: Retrieve Session IDs → Iterate Session List → Purge Sheet Rows.
- Purge Sheet Rows skickar utdata parallellt till både Fetch Session Messages och Clone Template Tab.
- Bekräfta grenen för flikupplägg: Clone Template Tab → Retitle Sheet Tab → Assign Session Identifier → Purge Sheet Rows.
Steg 5: konfigurera utdata till Google Sheets
Konversationsmeddelanden läggs till i rätt sessionsflik efter att de har hämtats från Postgres.
- Öppna Append Conversation Rows och ställ in Operation till
append. - Ställ in Sheet Name till
{{ $('Iterate Session List').item.json.session_id }}och Document ID till samma kalkylblad som används i Purge Sheet Rows. - Mappa kolumner med befintliga uttryck: Who =
{{ $json.message.type }}, Date ={{ $json.created_at.toDateTime().format('yyyy-MM-dd hh:mm:ss') }}, Message ={{ $json.message.content }}. - Credential Required: Anslut era
googleSheetsOAuth2Api-inloggningsuppgifter till Append Conversation Rows.
Steg 6: testa och aktivera ert arbetsflöde
Kör ett manuellt test för att bekräfta att sessions-ID:n hämtas, att flikar skapas/rensas och att konversationsmeddelanden visas korrekt.
- Klicka på Execute Workflow med Manual Launch Trigger.
- Verifiera att Retrieve Session IDs returnerar sessions-ID:n och att varje ID bearbetas av Iterate Session List.
- Bekräfta att Purge Sheet Rows rensar
A2:C10000, att Clone Template Tab skapar en ny flik och att Retitle Sheet Tab döper den till aktuellsession_id. - Kontrollera kalkylbladet så att Append Conversation Rows lägger till rader med Who, Date och Message.
- Aktivera arbetsflödet för att möjliggöra Scheduled Run Trigger för automatiserade exporter.
Vanliga fallgropar
- Google Sheets-behörigheter kan löpa ut eller kräva specifika rättigheter. Om något slutar fungera: kontrollera först n8n-skärmen Credentials och att det anslutna Google-kontot har åtkomst till målarket.
- Om du använder Wait-noder eller extern rendering varierar bearbetningstider. Öka väntetiden om nedströms noder fallerar på tomma svar.
- Postgres-scheman glider i verkligheten. Om din
created_at-kolumn saknas eller lagras i ett annat format kommer “datum”-kolumnen i Sheets att se fel ut tills du uppdaterar frågan och mappningen.
Vanliga frågor
Cirka en timme om din Postgres-tabell och dina Google-uppgifter är redo.
Nej. Du kommer främst att klistra in uppgifter och bekräfta att Postgres-frågorna matchar din tabell.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på $20/månad för högre volym. Du behöver också räkna in Google API-användning (oftast försumbar vid normal skrivning till kalkylark).
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 obegränsade körningar men kräver grundläggande serveradministration.
Ja, men gör det med eftertanke. Flödet använder ett steg “Assign Session Identifier” där sessionsnyckeln sätts innan flikar skapas. Om din minneskonfiguration stödjer en beständig identifierare (som user_id), mappa det värdet där så att flikarna i arket representerar användare, inte sessioner. Vanliga justeringar är att ändra frågan för sessions-ID, justera regeln för fliknamn och lägga till extra kolumner (som konversationsbetyg eller ärende-ID) när rader läggs till.
Oftast beror det på att OAuth-godkännandet har löpt ut eller att fel Google-konto används. Återanslut Google Sheets-uppgiften i n8n och bekräfta sedan att målarket är delat med det kontot. Kontrollera också att dina HTTP Request-steg (som används för att duplicera och döpa om flikar) pekar på rätt kalkylarks-ID. Om det fungerar för några sessioner och sedan fallerar kan rate limiting inträffa när du försöker bygga om många flikar samtidigt.
Om du self-hostar n8n finns ingen hård körningsgräns (det beror mest på din server och Google API-kvoter). På n8n Cloud är den praktiska gränsen kopplad till dina månatliga körningar. I verklig användning bearbetar team ofta några hundra sessioner per körning utan problem, så länge de håller ett bra tempo på flikskapande och skrivningar.
Ofta, ja. Den stora vinsten är kontroll: att loopa igenom sessioner, rensa flikar, duplicera en mallflik och sedan lägga till rader är den typen av flerstegslogik som blir klumpig (och dyr) i enklare verktyg. n8n låter dig också self-hosta, vilket spelar roll när loggarna växer och du inte vill betala per liten delsteg. Samtidigt: om du bara behövde en engångs-“exportera dagens rader till ett ark” kan Zapier eller Make gå snabbare att klicka ihop. Prata med en automationsexpert om du vill ha en rekommendation utifrån din volym.
När dina transkript automatiskt hamnar i Sheets blir granskningar enklare och beslut går snabbare. Sätt upp det en gång och öppna sedan bara den flik du behöver.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.