Att jaga kvitton är irriterande. Ännu värre är att när de väl kommer in måste du fortfarande kisa på totalsummor, skriva om datum för hand och gissa vilken kostnadskategori ekonomiavdelningen vill ha den här gången.
Den här Telegram-kvittoautomatiseringen slår hårdast mot Ops-chefer och ekonomiassistenter, men även byråägare som reser mycket i kundprojekt känner av det. Du laddar upp kvitton i chatten och får tillbaka en strukturerad uppdelning plus en totalsumma, utan att bygga ett kalkylarksmonster.
Det här arbetsflödet gör “skicka mig kvittona” till “här är sammanställningen”. Du får se hur det fungerar, vad du behöver och var team oftast kör fast.
Så fungerar automatiseringen
Se hur detta löser problemet:
n8n Workflow Template: Supabase + Telegram: kvitton till totalsumma i chatten
flowchart LR
subgraph sg0["Incoming Chat Event Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract Binary Segment", 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/merge.svg' width='40' height='40' /></div><br/>Combine Branches"]
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Fetch Supabase Records", pos: "b", h: 48 }
n3@{ icon: "mdi:play-circle", form: "rounded", label: "Incoming Chat Event", pos: "b", h: 48 }
n4@{ icon: "mdi:memory", form: "rounded", label: "Session Memory Buffer", pos: "b", h: 48 }
n5@{ icon: "mdi:brain", form: "rounded", label: "Mistral Chat Engine", pos: "b", h: 48 }
n6@{ icon: "mdi:wrench", form: "rounded", label: "Computation Tool", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check File Attachment", 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/code.svg' width='40' height='40' /></div><br/>Normalize Binary Payload"]
n9["<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/>OCR API Request"]
n10["<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/supabase.svg' width='40' height='40' /></div><br/>Persist OCR Result"]
n11@{ icon: "mdi:robot", form: "rounded", label: "Travel Expense Analyst", pos: "b", h: 48 }
n12@{ icon: "mdi:memory", form: "rounded", label: "Agent Memory Window", pos: "b", h: 48 }
n1 --> n11
n0 --> n8
n6 -.-> n11
n2 -.-> n11
n4 -.-> n3
n12 -.-> n11
n10 --> n1
n9 --> n10
n8 --> n9
n5 -.-> n11
n3 --> n7
n7 --> n0
n7 --> 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 trigger
class n11 ai
class n5 aiModel
class n6 ai
class n4,n12 ai
class n7 decision
class n9 api
class n8 code
classDef customIcon fill:none,stroke:none
class n1,n8,n9,n10 customIcon
Utmaningen: förvandla kvittokaos till utläggsersättning
Utlägg för resor är enkla i teorin, tills verkligheten dyker upp som suddiga foton, hotellfakturor uppdelade på flera sidor och taxikvitton som knappt ser ut som kvitton. Någon laddar upp en fil i en chatt. Någon annan kopierar siffror in i ett ark. Sedan börjar frågorna: “Vilken valuta är det här?” “Är dricks inkluderad?” “Vilket datum ska jag använda för hotellet?” Varje fram-och-tillbaka är liten, men i ett team blir det en veckovis tidstjuv och ett trovärdighetsproblem när totalsummor inte stämmer.
Det växer snabbt. Här är var det brukar fallera i det dagliga arbetet.
- Kvitton kommer i olika format, så din “process” ändras varje gång.
- Manuell inmatning skapar små fel som tar längre tid att hitta än att förebygga.
- Folk tappar kontext i chattrådar, så du ställer samma följdfrågor om och om igen.
- Det finns ingen sessionsbaserad historik över vad som skickats in, vilket gör totalsummor och revisioner smärtsamma.
Lösningen: ladda upp kvitton i Telegram, få totalsummor tillbaka
Det här n8n-flödet ger dig ett lättviktigt, chattbaserat inflöde för resekvitton. En användare skickar ett Telegram-liknande chattmeddelande (via flödets chat UI-trigger) och kan bifoga en eller flera kvittofiler. Om filer finns normaliserar flödet den binära payloaden, skickar varje fil till en OCR-endpoint och sparar OCR-“blocken” i Supabase under samma session. Sedan läser en AI-agent både chatttexten och den sparade OCR-utmatningen, extraherar strukturerade fält (leverantör, datum, valuta, total, kategori, anteckningar) och räknar fram en totalsumma med ett kalkylatorverktyg så att matematiken blir konsekvent. Till sist svarar agenten i chatten med en prydlig sammanställning som är redo att godkännas eller exporteras.
Flödet startar med ett chattmeddelande och valfria bilagor. OCR omvandlar stökiga bilder och PDF:er till maskinläsbara block, och Supabase håller dessa block kopplade till sessionen så att du kan be om en konsoliderad sammanfattning senare. Agenten formaterar resultatet som en strukturerad utgiftstabell med uppdelning per kategori och en totalsumma.
Vad som förändras: före vs. efter
| Det här tar bort | Effekten du ser |
|---|---|
|
|
Effekt i verkligheten
Säg att en kollega skickar in 8 kvitton från en resa. Manuellt är det kanske 5 minuter per kvitto att läsa, skriva in totalsummor och rimlighetskolla datum, plus ytterligare 10 minuter med frågor när något saknas, alltså ungefär 50 minuter. Med det här flödet laddar de upp allt en gång i chatten (cirka 2 minuter), OCR kör i bakgrunden och agenten returnerar utgiftstabellen och totalsumman. Du gör fortfarande en stickprovskontroll, men grovjobbet är borta.
Krav
- n8n-instans (testa n8n Cloud gratis)
- Self-hosting-alternativ om du föredrar det (Hostinger fungerar bra)
- Supabase för att lagra OCR-block per chattsession.
- OCR API-endpoint för att extrahera text från filer.
- Mistral Cloud-inloggningsuppgifter (hämta från din Mistral-kontopanel).
Svårighetsgrad: Medel. Du kopplar in inloggningsuppgifter, skapar en enkel Supabase-tabell och klistrar in en OCR-endpoint-URL.
Behöver du hjälp att implementera detta? Prata med en automationsexpert (gratis 15-minuters konsultation).
Flödet i arbetsflödet
Ett chattmeddelande startar allt. Flödet tar emot ett meddelande och (valfritt) kvittobilagor, med ett sessions-ID så att alla filer hålls kopplade till samma ersättningstråd.
Filerna förbereds för konsekvent hantering. Om en uppladdning finns delar n8n upp varje bilaga och normaliserar den binära payloaden så att OCR-anropet alltid ser likadant ut, även när användare skickar olika filtyper.
OCR körs och Supabase lagrar resultaten. Varje kvitto skickas till din OCR-leverantör via HTTP-begäran och de returnerade textblocken upsertas till en Supabase-temp_table med sessions-ID och filnamn.
En AI-agent extraherar utgifter och räknar totalsummor. Agenten läser chatkontexten plus OCR-blocken, plockar ut fält som leverantör, datum, valuta och totalbelopp och använder ett kalkylatorverktyg för att räkna fram en totalsumma över flera kvitton.
Du kan enkelt ändra vilka fält som extraheras och hur resultatet formateras, så att det matchar er policy för utlägg. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera chatttriggern
Konfigurera chattgränssnittet som samlar in användarmeddelanden och filuppladdningar för resekvitton.
- Lägg till noden Incoming Chat Event som din trigger.
- Ställ in Public på
true. - Ställ in Initial Messages på
👋 Hi there! 📝 Need help with a document? Upload it here! 🔐 We follow a zero-retention policy — your files are never stored permanently.. - I Options aktiverar ni Allow File Uploads och ställer in Load Previous Session på
memory. - Koppla Session Memory Buffer till Incoming Chat Event via AI-minnesanslutningen och ställ in Context Window Length på
10.
Steg 2: anslut Supabase
Konfigurera Supabase så att arbetsflödet kan lagra och hämta OCR-data.
- Öppna Persist OCR Result och välj er Supabase-anslutning. Inloggningsuppgifter krävs: Anslut era
supabaseApi-inloggningsuppgifter. - Ställ in Table ID på
temp_table. - Mappa fält i Fields: ställ in session_id på
{{ $('Incoming Chat Event').item.json.sessionId }}, file på{{ $json.data[0].parseJson().blocks }}och file_name på{{ $json.data[0].parseJson().source }}. - Öppna Fetch Supabase Records och välj er Supabase-anslutning. Inloggningsuppgifter krävs: Anslut era
supabaseApi-inloggningsuppgifter. - Ställ in Operation på
getAll, Table ID påtemp_tableoch lägg till ett filter där session_id är lika med{{ $('Incoming Chat Event').item.json.sessionId }}.
Steg 3: konfigurera filbearbetning
Detektera filuppladdningar, extrahera binärdata och normalisera den för OCR-API:t.
- Konfigurera Check File Attachment med ett villkor som kontrollerar om files finns med
{{ $json.files }}. - Koppla Incoming Chat Event till Check File Attachment.
- Koppla “true”-utgången från Check File Attachment till Extract Binary Segment.
- I Extract Binary Segment ställer ni in Field to Split Out på
$binaryoch aktiverar Include Binary. - Koppla Extract Binary Segment till Normalize Binary Payload och ställ in JS Code till:
return items.map(item => { const binaryKeys = Object.keys(item.binary || {}); const firstKey = binaryKeys[0]; if (!firstKey) { return item; } return { json: item.json, binary: { data: item.binary[firstKey] } }; });
Steg 4: konfigurera OCR-API-anropet
Skicka den normaliserade filen till er OCR-endpoint för att extrahera textdata.
- Koppla Normalize Binary Payload till OCR API Request.
- Ställ in Method på
POSToch Content Type påmultipart-form-data. - Lägg till body-parametrar: mode =
single, output_type =jsonl, include_images =false. - Lägg till ett binärt formulärfält med namnet files där Input Data Field Name är satt till
data.
Steg 5: konfigurera utdata-routing och persistens
Lagra OCR-resultat och slå sedan ihop flödet så att agenten kan svara oavsett om en fil laddades upp eller inte.
- Koppla OCR API Request till Persist OCR Result.
- Koppla Persist OCR Result till Combine Branches.
- Koppla “false”-utgången från Check File Attachment till den andra ingången på Combine Branches så att även förfrågningar med enbart text fortsätter.
Steg 6: konfigurera agenten för analys av resekostnader
Konfigurera AI-agenten för att analysera OCR-data och besvara användarfrågor om resekostnader.
- Koppla Combine Branches till Travel Expense Analyst.
- I Travel Expense Analyst ställer ni in Text på
{{ $('Incoming Chat Event').item.json.chatInput }}och behåller Prompt Type somdefine. - Koppla Mistral Chat Engine som språkmodell till Travel Expense Analyst och ställ in Model på
mistral-medium-latest. Inloggningsuppgifter krävs: Anslut eramistralCloudApi-inloggningsuppgifter. - Koppla Agent Memory Window till Travel Expense Analyst via AI-minne (inga inloggningsuppgifter krävs).
- Koppla Computation Tool och Fetch Supabase Records som AI-verktyg till Travel Expense Analyst så att den kan beräkna totalsummor och hämta sparade kvitton.
Steg 7: testa och aktivera ert arbetsflöde
Verifiera flödet från början till slut med ett exempelkvittot innan ni aktiverar i produktion.
- Klicka på Execute Workflow och öppna chattgränssnittet från Incoming Chat Event.
- Skicka ett meddelande och ladda upp en exempelkvittfil för att trigga Check File Attachment → Extract Binary Segment → OCR API Request.
- Bekräfta att Persist OCR Result skriver till Supabase och att Travel Expense Analyst returnerar en strukturerad sammanfattning med en totalsumma.
- Aktivera arbetsflödet genom att växla det till Active när resultaten ser korrekta ut.
Se upp för
- Supabase-inloggningsuppgifter kan löpa ut eller kräva specifika behörigheter. Om något skapar fel, kontrollera först API-nycklarna i ditt Supabase-projekt och tabellbehörigheterna.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströmsnoder fallerar på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in er tonalitet tidigt, annars kommer du redigera utdata för alltid.
Vanliga frågor
Vanligtvis på ungefär en timme när dina Supabase- och OCR-konton är klara.
Ja, men någon bör vara bekväm med att koppla konton och testa några exempelkvittton. Det är ingen “riktig kodning”, men du kommer att klistra in en OCR-endpoint och skapa en liten tabell i Supabase.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis testperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna in kostnader för OCR och AI-modellanvändning, som beror på leverantör och hur många kvitton du hanterar.
Två alternativ: n8n Cloud (managed, enklast setup) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och kör n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Du kan byta OCR-leverantör genom att ändra noden OCR API Request till en annan HTTP-endpoint, så länge den returnerar textblock som du kan lagra. Om du vill ha andra utdatafält justerar du agentinstruktionerna i Travel Expense Analyst (till exempel lägg till “projektkod” eller “kundnamn”). Vanliga anpassningar är striktare kategoriregler, att tvinga en hemmavaluta och att skriva de slutliga raderna till Google Sheets för bokföring.
Oftast är det en ogiltig eller roterad API-nyckel i n8n. Det kan också vara row-level security eller saknade behörigheter på temp_table, så att upsert misslyckas trots att inloggningsuppgifterna “kopplar upp”. Om du nyligen bytt namn på kolumner (som session_id eller file_name), uppdatera mappningen i noden Persist OCR Result så att den matchar.
I n8n Cloud Starter begränsas du av dina månatliga körningar, så högre kvittovolym kan tvinga dig till en större plan. Om du self-hostar finns ingen körningsgräns, och kapaciteten beror främst på din serverstorlek samt hastigheten i din OCR-API. I praktiken klarar flödet många kvitton eftersom det bearbetar dem ett i taget och lagrar OCR-utdata per session. Den verkliga begränsningen är oftast OCR:ens rate limits, inte n8n i sig.
Ofta ja, eftersom detta är mer än en enkel “fil in, rad ut”-zap. Du förgrenar baserat på om en fil finns, normaliserar binärdata, lagrar OCR-block för senare sessionssammanfattningar och använder en agent med ett kalkylatorverktyg för totalsummor. Zapier och Make kan göra delar av detta, men OCR i flera steg plus sessionsmedvetna sammanfattningar blir ofta rörigt och dyrt. Om du bara behöver “OCR:a ett kvitto och skicka mig texten” fungerar de bra. Om du vill ha chattupplevelsen och konsoliderade totalsummor passar n8n bättre. Prata med en automationsexpert om du vill ha hjälp att välja.
Ladda upp kvitton en gång, få tillbaka en användbar uppdelning och håll OCR-spåret säkert kopplat till sessionen i Supabase. Ärligt talat är det en liten förändring som gör att utläggsersättning känns tråkigt igen.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.