Dina fakturor är redan ”organiserade” någonstans. I en inkorg. I en delad mapp. I någons huvud. Sen kommer månadsskiftet, och du sitter och matar in totalsummor igen, jagar förfallodatum och försöker minnas om den leverantören redan fakturerade dig för samma sak två gånger.
Det är här automatisering av e-postfakturor betalar sig snabbt. Marketing ops-team som hanterar leverantörskostnader känner av kaoset, och småföretagare slutar oftast med att göra allt själva. Ekonomikonsulter och frilansare ser det också, särskilt när kunder skickar fakturor från fem olika leverantörer i fem olika format.
Det här arbetsflödet bevakar din inkorg, extraherar fakturadetaljer med AI, loggar dem i PostgreSQL och postar en korrekt formaterad sammanfattning till Discord så att rätt personer ser nya fakturor direkt.
Så här fungerar automatiseringen
Hela n8n-arbetsflödet, från trigger till slutresultat:
n8n Workflow Template: E-post till PostgreSQL: fakturor + Discord-larm
flowchart LR
subgraph sg0["Basic LLM Chain Flow"]
direction LR
n0@{ icon: "mdi:message-outline", form: "rounded", label: "Email Trigger (IMAP)", pos: "b", h: 48 }
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/discord.svg' width='40' height='40' /></div><br/>Discord"]
n2@{ icon: "mdi:robot", form: "rounded", label: "Basic LLM Chain", pos: "b", h: 48 }
n3@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", 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/code.svg' width='40' height='40' /></div><br/>Code"]
n6@{ icon: "mdi:cog", form: "rounded", label: "Extract from File1", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", 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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If2", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Company Data", 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/postgres.svg' width='40' height='40' /></div><br/>Check Company"]
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IF Company Does Not Exist", pos: "b", h: 48 }
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/postgres.svg' width='40' height='40' /></div><br/>Add Company"]
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Existing Company ID", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set New Company ID", pos: "b", h: 48 }
n17["<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/>Merge Company ID"]
n18["<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/>Check Invoice"]
n19@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IF Invoice Does Not Exist", pos: "b", h: 48 }
n20["<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 Invoice"]
n21@{ icon: "mdi:swap-vertical", form: "rounded", label: "Invoice Exists", pos: "b", h: 48 }
n22["<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/>Merge End"]
n7 --> n5
n9 --> n6
n10 --> n1
n10 --> n11
n5 --> n9
n8 --> n10
n14 --> n16
n20 --> n22
n12 --> n13
n18 --> n19
n21 --> n22
n2 --> n8
n17 --> n18
n3 -.-> n2
n6 --> n2
n6 --> n8
n16 --> n17
n0 --> n7
n11 --> n12
n15 --> n17
n4 -.-> n2
n13 --> n14
n13 --> n15
n19 --> n20
n19 --> n21
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,n4 ai
class n3 aiModel
class n7,n9,n10,n13,n19 decision
class n12,n14,n18,n20 database
class n5 code
class n0 disabled
classDef customIcon fill:none,stroke:none
class n1,n5,n8,n12,n14,n17,n18,n20,n22 customIcon
Problemet: fakturor ligger i e-post, inte i dina system
De flesta fakturaproblem är inte ”bokföringsproblem”. De är processproblem. En leverantör mejlar en PDF, du laddar ner den, döper om den, öppnar den, kopierar fakturanumret, skriver in beloppet och försöker sedan lista ut var du ska spara den så att du hittar den senare. Någon annan i teamet gör samma sak… eller glömmer. Nu har du dubbletter, missade förfallodatum och ett kalkylark som alltid ligger en faktura efter verkligheten. Och helt ärligt: den mentala belastningen är värst. Du kan inte planera kassaflödet när du inte litar på din egen lista.
Det blir snabbt mycket. Här brukar friktionen dyka upp:
- Att kopiera fält från PDF:er till ett kalkylark tar cirka 5 minuter per faktura, även när du jobbar snabbt.
- Ett missat förfallodatum blir till panikfix, eller en förseningsavgift du hade kunnat undvika.
- Dubbletter smyger sig in när leverantören skickar om en faktura eller när någon vidarebefordrar samma mejl internt.
- Din ”single source of truth” blir uppdelad mellan inkorgssökningar, mappar och en databas som saknar kontext.
Lösningen: AI extraherar fakturadata och loggar allt automatiskt
Den här automatiseringen lyssnar efter nya mejl i en dedikerad fakturainkorg via IMAP. När ett meddelande kommer in kontrollerar den bilagor och filtrerar ner till enbart PDF-fakturor. Därefter plockar den ut text ur PDF:en och skickar innehållet till en AI-baserad ”fakturaextraherare” (en OpenAI-chatmodell i en n8n LLM-kedja). Modellen returnerar strukturerade fält som fakturanummer, leverantörens organisations-/momsnummer, totalsummor, valuta och förfallodatum. Därifrån validerar arbetsflödet resultatet, slår upp leverantören i PostgreSQL, lägger in företaget om det är nytt och kontrollerar sedan om fakturan redan finns via en unik matchning på företag+fakturanummer. Till sist postar det ett Discord-meddelande med en lättläst sammanfattning så att du ser att ett nytt åtagande just landade.
Arbetsflödet startar med en övervakning av inkommande mejl. Sedan extraherar och normaliserar det fakturadata, kontrollerar dubbletter och skriver korrekt formaterade rader i dina tabeller company och invoice. Discord blir ditt realtidsflöde för ”ny faktura”, vilket gör att du kan agera innan det hinner staplas på hög.
Det här får du: automatisering vs. resultat
| Det här automatiserar arbetsflödet | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut i praktiken
Säg att du får ungefär 10 fakturor i veckan. Manuellt tar det oftast runt 5 minuter per faktura att ladda ner PDF:en, plocka ut fakturanummer, totalsumma, valuta, leverantörsdetaljer och förfallodatum, plus några minuter till för att informera teamet. Det är cirka 90 minuter per vecka, och det är lätt att göra misstag när du stressar. Med det här arbetsflödet lägger du kanske 2 minuter på att sätta upp regler för fakturainkorgen, och sedan sköter det sig självt. Mejlet kommer in, PostgreSQL uppdateras och Discord får sammanfattningen automatiskt.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger fungerar bra)
- E-post (IMAP) för att övervaka en fakturainkorg.
- PostgreSQL för att lagra tabellerna för företag och fakturor.
- Discord för att posta fakturasammanfattningar till en kanal.
- OpenAI API-nyckel (hämta den i din OpenAI-dashboard).
Kompetensnivå: Medel. Du kopplar konton, lägger in autentiseringsuppgifter och säkerställer att dina PostgreSQL-tabeller matchar förväntade fält.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Ett nytt fakturamejl kommer in. n8n övervakar din brevlåda via IMAP och triggar arbetsflödet så fort ett nytt meddelande dyker upp med bilagor.
Arbetsflödet behåller bara faktura-PDF:er. Det kontrollerar att mejlet faktiskt innehåller binära bilagor, filtrerar på PDF-filer och extraherar sedan text ur dokumentet så att det kan analyseras.
AI gör röriga fakturalayouter till strukturerade fält. OpenAI-chatmodellen läser den extraherade texten, och den strukturerade output-parsern tvingar svaret till förutsägbar JSON (fakturanummer, totalsummor, förfallodatum, leverantörsidentifierare). Om datan inte går igenom valideringen kan arbetsflödet stoppa innan det skräpar ner din databas.
PostgreSQL blir systemet som gäller, och Discord blir notifieringslagret. Arbetsflödet slår upp leverantören, lägger in den om den saknas, och kontrollerar sedan om fakturan redan finns innan det skriver en ny rad. En Discord-webhook postar en sammanfattning så att du och teamet ser vad som kom in utan att öppna PDF:en.
Du kan enkelt ändra notifieringsdestinationen till Slack eller Telegram beroende på behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera e-posttriggern
Det här arbetsflödet börjar med att övervaka en inkorg efter inkommande fakturor och ladda ner bilagor.
- Lägg till eller öppna Inbound Email Monitor och aktivera den om den är inaktiverad.
- Ställ in Download Attachments på
trueså att PDF:er är tillgängliga för bearbetning. - Inloggningsuppgifter krävs: Anslut era imap-uppgifter i Inbound Email Monitor.
Steg 2: Filtrera och extrahera PDF-innehåll
Inkommande e-post kontrolleras efter bilagor, filtreras till PDF:er och konverteras sedan till text för analys.
- I Attachment Check, säkerställ att villkoret kontrollerar att
{{$binary}}inte är tomt så att endast e-post med bilagor släpps igenom. - I PDF Attachment Filter, behåll JavaScript-koden som filtrerar på
mimeType === "application/pdf"för att bara släppa igenom PDF:er. - I Binary Presence Check, verifiera att villkoret använder
{{$binary}}för att bekräfta att den filtrerade PDF-datan finns. - I PDF Text Extractor, ställ in Operation till
pdfoch behåll Keep Source sombinary.
PDF Text Extractor skickar utdata parallellt till både LLM Invoice Extractor och Combine Email & AI.
Steg 3: Sätt upp AI-extraktion och parsning
AI-pipelinen tolkar den extraherade PDF-texten och omvandlar den till strukturerad fakturadata.
- Öppna LLM Invoice Extractor och bekräfta att extraktionsprompten matchar de fakturadetaljer ni behöver.
- I LLM Invoice Extractor, behåll meddelandemallen som refererar till filnamn och innehåll:
Filename: {{$binary.data.fileName}} Data: {{$json.text}}. - Säkerställ att Structured Data Parser innehåller JSON-schemaexemplet som ni vill att modellen ska returnera.
- Inloggningsuppgifter krävs: Anslut era openAiApi-uppgifter i OpenAI Chat Engine, som är språkmodellen som driver LLM Invoice Extractor.
- Obs: Structured Data Parser är en AI-undernod—lägg till uppgifter i OpenAI Chat Engine, inte i parsern.
Steg 4: Validera och avisera om fakturor
Efter AI-extraktion validerar arbetsflödet fakturor och avisera ert team samtidigt som företagsdata förbereds.
- I Combine Email & AI, behåll Mode inställt på
combineoch Combine By inställt påcombineByPosition. - I Invoice Validation, säkerställ att villkoret kontrollerar att
{{$json.output.isInvoice}}är true. - Bekräfta att Discord Alert Post innehåller innehållsmallen med fakturavariabler som
{{$json.output.invoiceDetails.invoiceNumber}}. - Inloggningsuppgifter krävs: Anslut era discordWebhookApi-uppgifter i Discord Alert Post.
Invoice Validation skickar utdata parallellt till både Discord Alert Post och Map Company Fields.
Steg 5: Lagra företags- och fakturadata i Postgres
Företags- och fakturaposter avdupliceras innan insert, och ID:n enhetliggörs för konsekvens.
- I Map Company Fields, mappa utställarens fält med uttryck:
{{$json.invoiceDetails.issuer.taxNumber}},{{$json.invoiceDetails.issuer.name}}och{{$json.invoiceDetails.issuer.address}}. - I Lookup Company Record, ställ in Query till
SELECT id FROM company WHERE tax_number = '{{ $json.issuer_tax_number }}';. - Inloggningsuppgifter krävs: Anslut era postgres-uppgifter i Lookup Company Record, Insert Company Row, Lookup Invoice Record och Insert Invoice Row.
- I Company Missing Branch, behåll villkoret som kontrollerar
{{$items('Lookup Company Record')[0].json.length}}för att välja mellan Insert Company Row och Use Existing Company ID. - I Use Existing Company ID ställer ni company_id till
{{$items('Lookup Company Record')[0].json[0].id}}, och i Use New Company ID ställer ni det till{{$json.id}}. - I Lookup Invoice Record, ställ in Query till
SELECT id FROM invoice WHERE invoice_number = '{{ $json.invoiceDetails.invoiceNumber }}' AND company_id = {{ $json.company_id }};. - I Invoice Missing Branch, behåll villkoret som kontrollerar
{{$items('Lookup Invoice Record')[0].json.length}}för att routa antingen Insert Invoice Row eller Invoice Duplicate Flag. - I Invoice Duplicate Flag, behåll värdet för status som
Invoice already existsoch låt sedan båda vägarna mötas i Finalize Merge.
Steg 6: Testa och aktivera ert arbetsflöde
Kör ett komplett test med ett riktigt fakturamejl för att bekräfta parsning, aviseringar och databas-inserts.
- Klicka på Execute Workflow och skicka ett testmejl med en PDF-faktura till den övervakade brevlådan.
- Verifiera att Discord Alert Post publicerar ett meddelande med fält som fakturanummer och totalsummor.
- Kontrollera era Postgres-tabeller för att bekräfta att en ny företags- eller fakturarad skapades, eller att Invoice Duplicate Flag sattes.
- När allt fungerar, växla arbetsflödet till Active för användning i produktion.
Vanliga fallgropar
- IMAP-inloggning kan löpa ut eller kräva ”app-lösenord” (vanligt med Gmail och Outlook). Om mejl slutar trigga, kontrollera din e-postleverantörs säkerhetsinställningar och spara sedan om IMAP-autentiseringsuppgiften i n8n.
- Om du använder Wait-noder eller extern rendering varierar bearbetningstiderna. Öka väntetiden om efterföljande noder skapar fel på grund av tomma svar.
- Standardprompter i AI-noder är generiska. Lägg till din tonalitet tidigt, annars kommer du redigera utdata för alltid.
Vanliga frågor
Cirka en timme om din inkorg, OpenAI-nyckel och PostgreSQL-databas är klara.
Nej. Du klistrar mest in autentiseringsuppgifter och mappar några fält i n8n.
Ja. n8n har ett gratis alternativ för egen hosting och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volymer. Du behöver också räkna med OpenAI API-kostnader, som vanligtvis är några cent per faktura beroende på modell och fakturalängd.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärt och hanterar n8n bra. Egen hosting ger obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det är en vanlig justering. Du kan ersätta Discord-webhook-noden med en Slack-nod (eller Microsoft Teams) och behålla resten av arbetsflödet likadant. Om du fortfarande vill använda Discord för vissa fakturor kan du grena på leverantörsnamn eller belopp och notifiera olika kanaler. Du kan också justera AI-extraktionsprompten i noden LLM Invoice Extractor för att hämta fler fält som inköpsordernummer eller bankuppgifter.
Oftast är det webhook-URL:en. Skapa om webhooken i Discords serverinställningar, uppdatera sedan Discord-noden i n8n och kör ett test med ett enskilt fakturamejl. Om det fortfarande inte fungerar, kontrollera att ditt arbetsflöde inte försöker skicka ett meddelande när fakturavalideringen misslyckas, eftersom vissa körningar inte kommer ha fälten som behövs för att bygga en korrekt formaterad sammanfattning.
Med n8n Cloud Starter kan du köra tusentals körningar per månad, vilket räcker för många små team. Om du hostar själv finns ingen körningsgräns; det beror främst på serverstorlek och hur snabbt du vill bearbeta PDF:er. Arbetsflödet hanterar normalt en faktura på under en minut efter att mejlet kommit in, där största delen av tiden går till textutvinning från PDF och AI-anropet.
Ofta, ja, eftersom det här flödet behöver förgrening, validering och databasslagningar för att förhindra dubbletter. n8n hanterar den typen av logik snyggt utan att tvinga dig till dyra ”premium”-steg, och egen hosting är ett alternativ när volymen växer. Zapier eller Make kan fortfarande fungera om du bara vill ha ”mejlbifogad fil till kalkylark” med en enkel notifiering. Om du är osäker, prata med en automationsexpert så pekar vi dig i rätt riktning.
När det här väl rullar slutar fakturainmatning vara ett veckomoment och blir en tyst bakgrundsprocess. Din databas hålls strukturerad, teamet hålls uppdaterat och du slutar lägga tid på inkorgen.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.