Behöver ert företag hjälp med att implementera AI? Kontakta oss och få prisoffert här →
AI Skolan
januari 22, 2026

Telegram till Google Sheets: kvitton loggas åt dig

Rickard Andersson Partner, Nodenordic.se

Du känner igen känslan: en skokartong med kvitton, ett rörigt bankflöde och ett kalkylark du svär att du ska “komma ikapp med” senare. Sen kommer månadsslutet, och du sitter och kisar på suddiga totalsummor och gissar kategorier du borde ha bokfört för flera veckor sedan.

Den här automationen för kvittologgning i Telegram träffar småföretagare först, men byråägare och finansansvariga som städar i efterhand känner också igen det. I stället för att skriva in varje leverantör, datum och totalsumma på nytt vidarebefordrar du ett kvitto i Telegram och din utgiftsrad dyker upp i Google Sheets på cirka 10 sekunder.

Nedan ser du hur flödet körs, vad det faktiskt producerar och var de riktiga tidsbesparingarna finns (inte bara “automation för automationens skull”).

Så fungerar automationen

Hela n8n-workflowen, från trigger till slutresultat:

n8n Workflow Template: Telegram till Google Sheets: kvitton loggas åt dig

Problemet: kvittologgning blir till panik vid månadsskiftet

Manuell utgiftsloggning är bedrägligt dyr. Ett kvitto är “snabbt”, men 40 kvitton blir till en lördag du inte ville offra. Och det är inte bara knappandet. Det är växlingen mellan appar, jakten på datumet, valutakonverteringar, att bestämma kategori och att försöka minnas vad “SP*ABC” var på kontoutdraget. Befintliga utgiftsappar kan hjälpa, men många team stöter på två problem: de kostar mer än du vill betala för enkel insamling och extraktionskvaliteten är ojämn, så du måste ändå dubbelkolla allt.

Det blir snabbt mycket. Här är var det faller isär i verkligheten.

  • Kvitton samlas på hög, så du gör klumpjobb när du redan har fullt upp.
  • Att skriva leverantör, totalsumma och datum för hand bjuder in småfel som förstör rapporter senare.
  • Kategorier glider över tid, vilket gör att din rad för “Måltider” blir en skräplåda.
  • Ersättningsregler (som “bara 80 % av telefonräkningar”) är lätta att glömma när du har bråttom.

Lösningen: Telegram → AI-extraktion → felfria rader i Google Sheets

Det här flödet gör Telegram till din inkorg för kvitton och PDF:er och förvandlar sedan det stökiga “verkliga” dokumentet till strukturerad utgiftsdata. Du skickar ett kvitto till din Telegram-bot (foto eller PDF). n8n hämtar filen, konverterar den till ett format som extraktorn kan läsa och skickar den till en extraktionspipeline (easybits) för att plocka ut nyckelfält som leverantörsnamn, totalbelopp, valuta, transaktionsdatum, kategori och konfidens. Om kategorin är oklar ställer boten en snabb följdfråga i Telegram i stället för att gissa. Till sist hittar (eller skapar) flödet rätt månadsflik i Google Sheets och lägger till en felfri, formaterad rad, och skickar sedan en bekräftelse med detaljerna som loggades.

Det börjar med ett Telegram-meddelande, går igenom AI-baserad dokumentextraktion plus några rimlighetskontroller och slutar i ett kalkylark som är klart för rapportering. Det bästa är rytmen: logga när det händer, inte flera veckor senare.

Det du får: automation vs. resultat

Exempel: så här ser det ut

Säg att du samlar in cirka 60 kvitton på en månad (kaffemöten, mjukvarutillägg, resor, som vanligt). Manuellt blir även “snabba” 2 minuter per kvitto ungefär 2 timmar knappande, plus den irriterande delen: att kontrollera totalsummor och datum när fotot är suddigt. Med det här flödet vidarebefordrar du varje kvitto när det händer, väntar cirka 10 sekunder på extraktionen och sen är du klar. På en månad är det flera timmar tillbaka och ett kalkylark som redan är organiserat i månadsflikar.

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)
  • Telegram-bot som tar emot kvittofoton och PDF:er.
  • Google Sheets för att lagra och organisera utgiftsrader.
  • easybits API-nyckel (hämta den från sidan easybits Pipeline Details).

Kunskapsnivå: Nybörjare. Du kommer mest att kopiera inloggningsuppgifter, klistra in ID:n och testa med några kvitton.

Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).

Så fungerar det

Du skickar ett kvitto till Telegram. Flödet startar när din Telegram-bot tar emot ett meddelande med en bilaga (foto eller PDF), och den kontrollerar direkt filtypen så att den inte försöker bearbeta slumpmässiga saker.

Kvittofilen hämtas och förbereds. n8n hämtar filmetadata och binärdata från Telegram och konverterar sedan till base64 så att den kan skickas på ett säkert och kompatibelt sätt till extraktionstjänsten.

AI extraherar nyckelfälten. easybits returnerar strukturerad data (leverantör, totalsumma, valuta, datum, kategori, konfidens) och flödet tolkar svaret. Om konfidensen för kategorin är låg pingar den dig i Telegram för att förtydliga, vilket ärligt talat slår att “gissa fel för alltid”.

Ditt Google Sheet hålls prydligt. n8n kontrollerar om rätt månadsflik finns, skapar den om den saknas, lägger på rubriker, lägger till den nya raden, formaterar den och skickar sedan en bekräftelse så att du vet vad som loggades.

Du kan enkelt justera kategorireglerna så att de matchar din kontoplan utifrån dina behov. Se den fullständiga implementationsguiden nedan för alternativ för anpassning.

Steg-för-steg-guide för implementation

Steg 1: Konfigurera webhook-triggern

Det här arbetsflödet startar när Telegram skickar en webhook-händelse som innehåller ett kvittofoto eller ett dokument.

  1. Lägg till noden Incoming Telegram Trigger och ställ in Path till expense-bot och HTTP Method till POST.
  2. Ställ in Response Mode till responseNode så att arbetsflödet kan svara via Return Webhook Ack och Return Webhook Ack 2.
  3. I Validate Attachment Type behåller ni villkorsuttrycket {{ $json.body.message.photo || $json.body.message.document ? 'yes' : 'no' }} lika med yes för att filtrera giltiga kvitto-uppladdningar.
  4. Observera att Validate Attachment Type skickar vidare till både Fetch File Metadata och Notify Missing Receipt parallellt beroende på villkorsresultatet.
⚠️ Vanlig fallgrop: Ersätt alla [CONFIGURE_YOUR_TOKEN]-platshållare i Telegram-URL:er i Fetch File Metadata, Retrieve File Binary, Run Receipt Extraction, Send User Confirmation och Notify Missing Receipt, annars triggas webhooken men inga filer kommer att hämtas.

Steg 2: Anslut Google Sheets

Flera noder läser och skriver till er utgiftsarbetsbok i Google Sheets, så anslut autentisering en gång och återanvänd den.

  1. Öppna Verify Sheet Presence och ställ in URL till https://sheets.googleapis.com/v4/spreadsheets/[YOUR_ID]/values/'{{ $('Interpret Extraction Data').item.json.sheet_name }}'!A1.
  2. Anslut autentisering: Credential Required: Anslut era googleSheetsOAuth2Api-autentiseringsuppgifter.
  3. Upprepa samma autentisering för Google Sheets-noder som skriver och formaterar data: Generate Monthly Sheet, Apply Sheet Headers, Retrieve Sheet List, Append Expense Entry och Format Expense Row.
  4. Ersätt [YOUR_ID] i alla Google Sheets-URL:er med ert kalkylblads-ID.
Tips: Eftersom det här arbetsflödet använder 6+ Google Sheets-anrop, bekräfta att samma kalkylblads-ID används i varje Sheets-URL för att undvika att poster delas upp över flera filer.

Steg 3: Sätt upp kvittohantering

Dessa noder hämtar kvittofilen, kodar den, extraherar fält och normaliserar data som används i senare steg.

  1. I Fetch File Metadata ställer ni in URL till =https://api.telegram.org/bot[CONFIGURE_YOUR_TOKEN]/getFile och JSON Body till {{ JSON.stringify({ file_id: $json.body.message.photo ? $json.body.message.photo.slice(-1)[0].file_id : $json.body.message.document.file_id }) }}.
  2. I Retrieve File Binary ställer ni in URL till =https://api.telegram.org/file/bot[CONFIGURE_YOUR_TOKEN]/{{ $json.result.file_path }} och säkerställer att svarsformatet är fil/binärt.
  3. Behåll den befintliga JavaScript-koden i Encode File Base64 för att bygga en data-URI och hämta chatId och mimeType från Incoming Telegram Trigger.
  4. I Run Receipt Extraction ställer ni in URL till https://extractor.easybits.tech/api/pipelines/dYI3r9xfHldQBlei34Pe och JSON Body till {{ JSON.stringify({ files: ["https://api.telegram.org/file/bot[CONFIGURE_YOUR_TOKEN]/" + $('Fetch File Metadata').first().json.result.file_path] }) }}.
  5. Lämna Interpret Extraction Data som den är; den standardiserar fält som category, vendor_name, total_amount och beräknar sheet_name och eur_amount.
⚠️ Vanlig fallgrop: Extraktionsendpointen använder en bearer-token i Run Receipt Extraction-headers. Uppdatera Authorization med er giltiga token, annars kommer extraktionen att returnera tomma data.

Steg 4: Konfigurera villkorsstyrd routning och kategori-frågor

Arbetsflödet förgrenas beroende på om en kategori upptäcktes och om ett månadsblad redan finns.

  1. I Check Category Needed behåller ni det booleska villkoret {{ $json.needs_category_input }} lika med true.
  2. Check Category Needed skickar vidare till både Request Category Detail och Verify Sheet Presence parallellt, så att användaren ombeds ange en kategori samtidigt som bladkontrollen körs.
  3. Öppna Request Category Detail och verifiera meddelandemallen och Chat ID-mappningen: {{ $('Interpret Extraction Data').item.json.chat_id }}. Credential Required: Anslut era telegramApi-autentiseringsuppgifter.
  4. I Sheet Missing Check behåller ni villkorsuttrycket {{ $json.values ? 'yes' : 'no' }} lika med no för att upptäcka saknade månadsblad.
  5. Sheet Missing Check skickar vidare till både Generate Monthly Sheet och Retrieve Sheet List parallellt, så att bladet kan skapas och därefter hittas via ID.

Steg 5: Konfigurera utdataåtgärder

Dessa noder skapar eller formaterar bladet, lägger till utgiftsraden och notifierar användaren i Telegram.

  1. I Generate Monthly Sheet behåller ni batchUpdate-body och säkerställer att uttrycket för bladets titel använder {{ $('Interpret Extraction Data').item.json.sheet_name }}. Credential Required: Anslut era googleSheetsOAuth2Api-autentiseringsuppgifter.
  2. I Assemble Header Payload behåller ni befintlig JS så att den skapar ett formaterat sidhuvud, styling för datarad och formel för totalrad; den skickar requestBody till Apply Sheet Headers.
  3. I Apply Sheet Headers ställer ni in JSON Body till {{ $json.requestBody }}. Credential Required: Anslut era googleSheetsOAuth2Api-autentiseringsuppgifter.
  4. I Compose Expense Row behåller ni den nuvarande JS-mappningen så att den output:ar expenseBody-arrayen och sheetId.
  5. I Append Expense Entry ställer ni in URL till https://sheets.googleapis.com/v4/spreadsheets/[YOUR_ID]/values/{{ $('Interpret Extraction Data').item.json.sheet_name }}!A4:G4:append?valueInputOption=USER_ENTERED&insertDataOption=OVERWRITE och JSON Body till {{ $json.expenseBody }}. Credential Required: Anslut era googleSheetsOAuth2Api-autentiseringsuppgifter.
  6. I Prepare Row Formatting behåller ni JS:en som extraherar det tillagda radnumret och förbereder formatBody för formatering.
  7. I Format Expense Row ställer ni in JSON Body till {{ $json.formatBody }}. Credential Required: Anslut era googleSheetsOAuth2Api-autentiseringsuppgifter.
  8. I Send User Confirmation behåller ni Telegram-meddelandemallen med uttryck som {{ $('Interpret Extraction Data').item.json.sheet_name }} för återkoppling till användaren.
Tips: Om ni behöver justera styling för sidhuvudet eller formeln för totalraden, redigera JSON-payloaden i Assemble Header Payload istället för i Sheets-noderna.

Steg 6: Testa och aktivera ert arbetsflöde

Validera hela flödet end-to-end genom att skicka ett testkvitto och bekräfta att data hamnar i rätt Google Sheet.

  1. Klicka på Execute Workflow och skicka ett kvittofoto eller en PDF till er Telegram-bot för att trigga Incoming Telegram Trigger.
  2. Bekräfta att Send User Confirmation postar ett lyckat meddelande och att raden visas i rätt månadsblad i Google Sheets.
  3. Testa den ogiltiga vägen genom att skicka ett meddelande som inte är en bild och verifiera att Notify Missing Receipt och Return Webhook Ack 2 körs.
  4. När ni är nöjda, slå på arbetsflödet till Active för produktion.
🔒

Lås upp fullständig steg-för-steg-guide

Få den kompletta implementeringsguiden + nedladdningsbar mall

Vanliga fallgropar

  • Telegram-inloggningar kan gå ut eller så kan bot-token klistras in fel. Om det skapar fel: kontrollera Telegram-credential i n8n och bekräfta först att boten fortfarande svarar i Telegram.
  • Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om noder längre fram fallerar på tomma svar.
  • easybits API-headers kräver exakt format: “Bearer YOUR_API_KEY”. Om extraktionen plötsligt returnerar obehörig, kopiera API-nyckeln igen från sidan easybits Pipeline Details och uppdatera HTTP Request-noden.

Vanliga frågor

Hur lång tid tar det att sätta upp den här automationen för kvittologgning i Telegram?

Cirka 30 minuter om din Telegram-bot och ditt Google Sheet är redo.

Behöver jag kunna koda för att automatisera kvittologgning i Telegram?

Nej. Du kopplar ihop konton, klistrar in några ID:n och testar med riktiga kvitton.

Är n8n gratis att använda för det här workflowet för kvittologgning i Telegram?

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 med kostnader för easybits-extraktion och eventuell OpenAI-användning om du utökar AI-promptarna.

Var kan jag hosta n8n för att köra den här automationen?

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.

Kan jag anpassa det här workflowet för kvittologgning i Telegram för flera ersättningsregler (som 80 % av telefonräkningar)?

Ja, men planera reglerna i förväg. De flesta gör det genom att ändra logiken som bygger utgiftsraden (kodsteget “Compose Expense Row”) så att den tillämpar en multiplikator för vissa kategorier. Du kan också justera beslutet “Check Category Needed” så att boten bara ber om extra detaljer för kategorier du bryr dig om (som kunders återdebiterbara kostnader). Vanliga justeringar är egna kategorilistor, en “debiterbar”-flagga och olika satser per leverantör.

Varför fallerar min Telegram-anslutning i det här flödet?

Oftast är det bot-token eller steget där Telegram-filen hämtas. Bekräfta att boten fortfarande svarar i Telegram och kontrollera sedan Telegram-credentials i n8n igen. Om kvittot är en udda filtyp kan flödet routa till “Notify Missing Receipt”-spåret i stället för att bearbeta det. Kontrollera också att n8n kan nå Telegrams API från din hostingmiljö (vissa företagsnätverk blockerar det).

Hur många kvitton klarar den här automationen för kvittologgning i Telegram?

På n8n Cloud Starter brukar du ligga bra till för en typisk småföretagsvolym, och self-hosting tar bort exekveringsgränser (din server blir begränsningen). I praktiken tar varje kvitto cirka 10 sekunder att extrahera, så stadig daglig användning är inget problem. Om du kör hundratals i en batch kan du slå i rate limits på extraktions-API:t eller Google Sheets-anrop, så lägg till throttling eller en kö.

Är den här automationen för kvittologgning i Telegram bättre än att använda Zapier eller Make?

Ofta, ja. n8n är mer bekvämt när du behöver förgrenad logik (som “be om kategoriförtydligande” bara ibland), skapande av månadsark och radformatering utan att betala extra för varje villkorssteg. Zapier eller Make kan fortfarande fungera om du bara vill ha “skicka fil → tolka → lägg till rad”, men så fort du lägger till regler och undantag blir det klumpigt. Om du är osäker: rita upp din “happy path” och dina två vanligaste edge cases och välj utifrån det. Prata med en automationsexpert om du vill ha en second opinion.

När det här väl rullar slutar kvitton vara ett “sen”-problem. Du skickar, det loggas och ditt kalkylark hålls tyst uppdaterat.

Kontakta oss

Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.

×

Använd mall

Få direkt tillgång till denna n8n-arbetsflödes JSON-fil

Launch login modal Launch register modal