Din inkorg har svaren. Problemet är att du inte kan hitta dem pålitligt när det verkligen gäller, så du slutar med att läsa om trådar, gissa nyckelord eller ställa samma fråga igen.
Den här uppsättningen för Gmail Postgres-sökning träffar ops-chefer och stressade byråägare först. Men marknadsförare som jagar kundgodkännanden och founders som spårar kvitton känner av det också. Du får ett privat ”sökbart minne” av din e-posthistorik, så detaljerna kommer fram snabbt – med källor.
Nedan ser du hur arbetsflödet fångar nya Gmail-meddelanden, backfillar gamla i batchar och lagrar både strukturerad metadata och vektor-inbäddningar i Postgres så att framtida sökningar faktiskt fungerar.
Så fungerar den här automatiseringen
Hela n8n-arbetsflödet, från trigger till slutresultat:
n8n Workflow Template: Gmail + Postgres: hitta gamla mejl direkt
flowchart LR
subgraph sg0["Gmail Flow"]
direction LR
n0@{ icon: "mdi:vector-polygon", form: "rounded", label: "Embeddings Ollama", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "Default Data Loader", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Recursive Character Text Spl..", pos: "b", h: 48 }
n3@{ icon: "mdi:play-circle", form: "rounded", label: "Gmail Trigger", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Was manually triggered?", pos: "b", h: 48 }
n7@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Trigger", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set before and after dates", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract email fields", pos: "b", h: 48 }
n11["<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/>Store structured"]
n12@{ icon: "mdi:cube-outline", form: "rounded", label: "Store vectorized", pos: "b", h: 48 }
n13["<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/>Create the table"]
n14["<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/>Explode interval into weeks"]
n15@{ icon: "mdi:message-outline", form: "rounded", label: "Get a batch of messages", pos: "b", h: 48 }
n5 --> n4
n3 --> n10
n7 --> n13
n4 --> n9
n13 --> n14
n11 --> n12
n11 --> n4
n12 --> n6
n0 -.-> n12
n1 -.-> n12
n10 --> n11
n15 --> n10
n6 --> n8
n6 --> n4
n9 --> n15
n14 --> n5
n2 -.-> n1
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 n3,n7 trigger
class n1,n2 ai
class n12 ai
class n0 ai
class n6 decision
class n11,n13 database
class n14 code
classDef customIcon fill:none,stroke:none
class n11,n13,n14 customIcon
Problemet: din inkorg är ”sökbar” tills den inte är det
Gmails sök fungerar bra när du minns avsändaren, den exakta frasen eller tidsintervallet. Verkligheten är stökigare. Du minns resultatet (”hotellets namn”, ”återbetalningspolicyn”, ”kundens slutpris”) men inte orden som användes i mejltråden. Så du scrollar, du öppnar fem nästan-träffar, och du är fortfarande inte säker på att du hittade rätt meddelande. Det handlar inte bara om tid. Det skapar mental friktion – och det leder till onödiga följdfrågor som får dig att se oförberedd ut.
Det summerar snabbt. Här är var det fallerar i det dagliga arbetet.
- Nyckelordssök missar mejl som säger samma sak med andra ord, vilket är vanligt i långa kundtrådar.
- Folk vidarebefordrar skärmdumpar eller sammanfattningar i stället för originalkällan, så sammanhanget förvanskas.
- Gamla beslut ”försvinner” eftersom de ligger begravda i svar och du inte minns vilken ämnesrad de låg under.
- När en kollega frågar dubbelkollar du allt ändå, eftersom det är riskabelt att gissa fel.
Lösningen: lagra Gmail som strukturerad data + semantiskt minne i Postgres
Det här arbetsflödet gör om Gmail till en databas du kan fråga senare, på två kompletterande sätt. Först fångar det mejlets praktiska fakta (meddelande-ID, datum, avsändare, ämne och annan metadata) i en strukturerad Postgres-tabell. Sedan skapar det vektor-inbäddningar för mejlinnehållet och lägger in dem i en PGVector-tabell, vilket möjliggör ”semantisk” sökning (sök på innebörd, inte exakt formulering). Det stöder också en engångs-backfill: du anger datumet du skapade ditt Gmail-konto och kör sedan arbetsflödet för att importera historiken i tidsfönster, så att du slipper hämta allt på en gång. Efter det ser en Gmail-trigger till att nya mejl flyter in automatiskt.
Arbetsflödet startar antingen med en manuell körning (för backfill) eller Gmail Watch Trigger (för nya meddelanden). Mejlen laddas in, rensas upp och delas upp i mindre delar för bättre inbäddningar. Därefter uppdateras Postgres med både metadata och vektorer, kopplade via Gmails meddelande-ID så att du alltid kan spåra ett sökresultat tillbaka till exakt mejl.
Vad du får: automatisering vs. resultat
| Vad det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här kan det se ut
Säg att du behöver svara på fem ”snabba frågor” om dagen som bygger på gammal mejlkontext (priser, resedetaljer, godkännanden). Manuellt kanske du lägger cirka 10 minuter per fråga på att söka, öppna trådar och verifiera – alltså ungefär 50 minuter dagligen. Med det här arbetsflödet igång i bakgrunden skiftar jobbet: du lägger kanske 2 minuter på att fråga ett semantiskt sökverktyg som frågar Postgres och länkar tillbaka till exakt meddelande. Det är runt 40 minuter tillbaka de flesta dagar – och svaren kommer med underlag.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Gmail för e-poståtkomst och triggers
- Postgres med pgvector för att lagra metadata och inbäddningar
- Ollama för att köra lokala inbäddningar (nomic-embed-text)
Kunskapsnivå: Medel. Du kopplar konton, sätter upp Postgres/pgvector och klistrar in några uppgifter, men du skriver ingen app.
Vill du slippa sätta upp detta själv? Prata med en automationsspecialist (gratis 15-minuters konsultation).
Så fungerar det
Nytt mejl kommer in (eller så startar du en backfill-körning). Gmail Watch Trigger plockar upp nya meddelanden automatiskt. För historisk import kör du Manual Start Trigger och anger ett startdatum så att arbetsflödet vet hur långt tillbaka det ska gå.
Tidsfönster gör importen hanterbar. Ett veckointervall skapas och sedan itererar arbetsflödet genom dessa fönster och hämtar Gmail i batchar. Det minskar API-strul och gör det enklare att återstarta om du pausar.
Mejlinnehållet förbereds för inbäddningar. Arbetsflödet laddar mejltext, delar upp den i chunks (så att ett jättelångt mejl inte blir en lågkvalitativ inbäddning) och skickar dessa chunks till Ollamas inbäddningsmotor.
Postgres får två användbara vyer av samma mejl. En tabell lagrar strukturerad metadata du kan filtrera (datum, från, ämne och Gmail-meddelande-ID). En annan lagrar vektorer i PGVector, med Gmail-meddelande-ID sparat som metadata så att semantiska resultat alltid kan mappas tillbaka till en exakt källa.
Du kan enkelt justera datumfönstren efter din volym, eller utöka lagrad metadata om du vill ha saker som etiketter och tråd-ID:n. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: konfigurera triggern Gmail Watch Trigger
Konfigurera triggern som övervakar er Gmail-inkorg efter nya meddelanden och startar automatiseringen.
- Lägg till och öppna Gmail Watch Trigger.
- Ställ in Simple på
false. - Under Filters, ställ in Label IDs till
INBOX. - Under Options, aktivera Download Attachments.
- I Poll Times, välj Every Minute.
- Credential Required: anslut era Gmail OAuth2-autentiseringsuppgifter.
Steg 2: anslut Gmail för batch-backfill
Konfigurera den historiska backfill-vägen som laddar e-post i veckovisa batchar vid manuell körning.
- Öppna Manual Start Trigger för att tillåta manuella körningar för backfill.
- I Initialize Metadata Table, ställ in Operation till
executeQueryoch behåll den angivna SQL:en förpublic.emails_metadata. - Öppna Generate Weekly Range och bekräfta att Mode är
runOnceForEachItemmed den angivna JS Code (redigerawhenDidICreateMyGmailAccount = DateTime.fromISO('2013-11-01')vid behov). - I Split Weeks, ställ in Field To Split Out till
weeksoch Destination Field Name tillafter. - I Assign Date Window, ställ in after till
{{ $json.after }}och before till{{ DateTime.fromISO($json.after).plus(1, 'week').toISODate() }}. - I Fetch Gmail Batch, ställ in Operation till
getAll, Return All tilltrue, och ställ in Received After till{{ $json.after }}samt Received Before till{{ $json.before }}. - Credential Required: anslut era Gmail OAuth2-autentiseringsuppgifter i Fetch Gmail Batch.
Steg 3: sätt upp fältmappning för e-post
Normalisera fält från Gmail-meddelanden till ett konsekvent schema för lagring och embeddings.
- Öppna Map Email Fields och lägg till tilldelningarna exakt som visat.
- Ställ in email_text till
{{ $json.text }}. - Ställ in email_from till
{{ $json.from?.text ?? '' }}, email_to till{{ $json.to?.text ?? '' }}, och email_cc till{{ $json.cc?.text ?? ''}}. - Ställ in date till
{{ DateTime.fromISO($json.date).toISO() }}. - Ställ in email_id till
{{ $json.id }}och thread_id till{{ $json.threadId }}. - Ställ in email_subject till
{{ $json.subject }}och attachments till{{ Object.keys($binary).map(item => $binary[item].fileName).filter(item => !!item) }}.
Steg 4: konfigurera databaslagring och upsert
Spara normaliserad e-postmetadata i PostgreSQL och förbered poster för vektorinsättning.
- Öppna Initialize Metadata Table och bekräfta att SQL:en skapar
public.emails_metadata. - I Upsert Email Metadata, ställ in Operation till
upsert. - Ställ in Schema till
publicoch Table tillemails_metadata. - Behåll Matching Columns inställt på
email_idför att säkerställa idempotenta upserts. - Credential Required: anslut era Postgres-autentiseringsuppgifter i Initialize Metadata Table och Upsert Email Metadata.
Steg 5: sätt upp embeddings och vektorlagring
Dela upp e-posttexten i chunkar, ladda den i dokument, skapa embeddings och lagra dem i PGVector.
- Öppna Recursive Text Chunker och ställ in Chunk Size till
2000och Chunk Overlap till50. - I Standard Data Loader, ställ in JSON Data till
{{ $('Map Email Fields').item.json.email_text }}och behåll JSON Mode somexpressionData. - I metadata för Standard Data Loader, ställ in emails_metadata.id till
{{ $('Map Email Fields').item.json.email_id }}och emails_metadata.thread_id till{{ $('Map Email Fields').item.json.thread_id }}. - Öppna Ollama Embedding Engine och ställ in Model till
nomic-embed-text:latest. - I Insert Vector Embeddings, ställ in Mode till
insertoch Table Name tillemails_embeddings. - Credential Required: anslut era Postgres-autentiseringsuppgifter i Insert Vector Embeddings.
Embedding-autentiseringsuppgifter i OpenAI-stil ska läggas till i överordnad nod: Ollama Embedding Engine är ansluten till Insert Vector Embeddings som embedding-modell—säkerställ att autentiseringsuppgifter läggs till i Ollama Embedding Engine, inte i undernoderna.
Steg 6: konfigurera logik för manuell körning och platshållare
Styr loopbeteendet för manuella backfills och tillhandahåll en säker slutpunkt för workflowet.
- Öppna Manual Run Check och ställ in villkoret att utvärdera
{{ $('Manual Start Trigger').isExecuted }}(Boolean false). - Bekräfta att flödet från Manual Run Check går till No-Op Placeholder när den manuella triggern inte har körts.
- Lämna No-Op Placeholder som den är för säker avslutning och felsökning.
⚠️ Vanlig fallgrop: Om den manuella triggern lämnas okörd under ett backfill-test kommer flödet att stanna vid No-Op Placeholder och veckoloopen kommer inte att fortsätta.
Steg 7: granska körflödet
Validera end-to-end-vägen så att data flödar från Gmail till Postgres och sedan in i PGVector.
- Bekräfta Gmail Watch Trigger → Map Email Fields → Upsert Email Metadata → Insert Vector Embeddings → Manual Run Check → No-Op Placeholder.
- Bekräfta den manuella backfill-vägen: Manual Start Trigger → Initialize Metadata Table → Generate Weekly Range → Split Weeks → Iterate Records → Assign Date Window → Fetch Gmail Batch → Map Email Fields.
- Säkerställ att Upsert Email Metadata skickar utdata till både Insert Vector Embeddings och Iterate Records baserat på workflow-anslutningarna.
Steg 8: testa och aktivera ert workflow
Kör ett manuellt test, bekräfta lyckad lagring och aktivera sedan automatiseringen.
- Klicka på Execute Workflow och trigga Manual Start Trigger manuellt för att testa backfill-vägen.
- Verifiera att Initialize Metadata Table skapar tabellen och att Upsert Email Metadata skriver poster.
- Bekräfta att Insert Vector Embeddings infogar rader i
emails_embeddingsoch att embeddings genereras. - Skicka ett nytt Gmail till den övervakade inkorgen och verifiera att Gmail Watch Trigger startar live-vägen.
- När testerna passerar, växla workflowet till Active för att köra kontinuerligt.
Vanliga fallgropar
- Gmail-autentiseringsuppgifter kan gå ut eller tappa behörigheter. Om synken plötsligt stannar, kontrollera först Gmail-uppgiften i n8n och bekräfta sedan att Google-kontot fortfarande tillåter Gmail-scope.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströms noder fallerar på tomma svar.
- PGVector-insert kan misslyckas om inbäddningsdimensionen inte matchar din tabelldefinition. Om du byter Ollama-modell för inbäddningar, verifiera vektorkolumnens dimension innan du kör backfill igen.
Vanliga frågor
Räkna med cirka 60–90 minuter om Postgres och Ollama redan är igång.
Ingen kod krävs. Du kommer främst att koppla konton och klistra in autentiseringsuppgifter i n8n.
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 infrastrukturkostnader för Postgres och att köra Ollama lokalt.
Två alternativ: n8n Cloud (hanterat, enklast att sätta upp) 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 serveradministration.
Ja, men du behöver en stabil meddelandeidentifierare. Du kan ersätta Gmail-triggern och Gmail-hämtningsnoderna med en Microsoft Graph-e-postnod och sedan mappa Message-ID (eller Graphs message id) i steget ”Map Email Fields” så att båda Postgres-tabellerna fortfarande korrelerar korrekt. Vanliga anpassningar är att lagra etiketter/mappar, behålla tråd-ID:n och bara skapa inbäddningar för vissa avsändare (som kunder).
Oftast beror det på utgången OAuth-åtkomst eller att Gmail-behörighetsscope har tagits bort. Anslut Gmail-uppgiften på nytt i n8n och bekräfta sedan att du använder samma Google-konto som du ursprungligen auktoriserade. Om du backfillar mycket historik kan även Gmail API-begränsningar slå till, så att minska batchstorleken hjälper.
Väldigt många, så länge din databas hänger med. På n8n Cloud är din praktiska gräns din månatliga exekveringslimit, medan self-hosting beror på serverresurser. Den större begränsningen är oftast lagring av inbäddningar och Postgres-prestanda, inte n8n i sig, så räkna med att trimma index när du kommer upp i tiotusentals mejl.
Ofta, ja – om du bryr dig om ”tvåtabells”-designen (metadata plus vektorer) och vill ha kontroll. n8n hanterar förgreningslogik och batch-backfills utan att bli krångligt eller dyrt, och du kan self-hosta för obegränsade körningar. Zapier/Make är fortfarande bra för snabba tvåstegsautomationer, men det här ligger närmare att bygga intern infrastruktur än att trigga en webhook. Om du är osäker på vad som passar, prata med en automationsspecialist så får du en rak rekommendation.
När det här väl rullar slutar inkorgen vara en belastning. Den blir ett referenssystem du kan lita på, med källor du kan plocka fram på några sekunder.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.