🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

Telegram to Google Sheets, expenses logged hands free

Lisa Granqvist Partner Workflow Automation Expert

You meant to log that coffee. Then the day happened. By the time you remember, the receipt is gone, the amount is fuzzy, and your “budget” is basically vibes.

Founders feel it when month-end rolls around. Marketers notice it when reimbursements drag. And if you run a small team, you already know the pain of chasing people for “just one more expense.” This Telegram Sheets expenses automation fixes that.

You send a quick Telegram message (or a voice note, or a receipt photo). The workflow turns it into clean rows in Google Sheets, updates budgets, and even sends a quiet daily summary when you stop logging for a bit. Here’s how it works and what you’ll get out of it.

How This Automation Works

The full n8n workflow, from trigger to final output:

n8n Workflow Template: Telegram to Google Sheets, expenses logged hands free

The Problem: Expense tracking dies in the data entry

Most expense apps fail for one boring reason: you have to open them. Unlock your phone, find the app, wait for it to load, pick a category, type an amount, pick a currency, save. It’s not “hard,” it’s just annoying enough that small purchases don’t get logged. Those small purchases add up, and the bigger cost is mental. You carry a constant “I should track this” guilt, then your spreadsheet is missing half the story when you actually need it.

It adds up fast. Here’s where it breaks down in real life.

  • You forget the small stuff (parking, coffee, tips), and those are usually the most frequent.
  • Manual categorizing takes longer than it should, so you skip it or guess, which makes reports useless later.
  • Receipt photos live in your camera roll with no structure, so you cannot search, filter, or summarize them.
  • Budget tracking becomes a once-a-month scramble instead of a calm, daily habit.

The Solution: Log expenses in Telegram, auto-write to Google Sheets

This n8n workflow turns Telegram into your fastest expense input. You message a Telegram bot with whatever you have in the moment: plain text (“Lunch 12, Taxi 8”), a voice note while you’re driving, or a photo of a receipt. The workflow detects what you sent, then uses an AI model to extract the merchant/item, amount, currency, and a sensible category. If you list multiple items in one message, it intelligently splits them into separate expenses. Finally, it appends clean, structured rows into your Google Sheet, where the data is fully yours and ready for filtering, pivot tables, or a dashboard.

It starts with a Telegram message and routes by input type (text, voice, photo). AI handles extraction and currency detection, then n8n normalizes the result and writes it to Google Sheets. After that, a “quiet” reporting layer waits for about 30 minutes of inactivity before sending a tidy summary, so you don’t get spammed after every entry.

What You Get: Automation vs. Results

Example: What This Looks Like

Say you log 6 expenses a day. In a typical expense app, even a “quick” entry is maybe 1 minute once you unlock, open, category-pick, and save, so that’s about 6 minutes daily (and realistically, you skip a few). With this workflow, you can send “Coffee 5, Metro 3” in one Telegram message in about 10 seconds, and the workflow splits it into two rows. Add one receipt photo that takes another 10 seconds. You’re done in under a minute, and your sheet stays accurate without you thinking about it.

What You’ll Need

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Telegram to send texts, voice notes, and photos
  • Google Sheets to store your expense ledger
  • Gemini API key (get it from Google AI Studio / Google Cloud)

Skill level: Intermediate. You’ll connect accounts, copy a Sheet template, and edit a few configuration fields in n8n.

Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).

How It Works

A Telegram message triggers everything. When your bot receives a message, the workflow loads your user settings (spreadsheet ID, currency defaults, locale formatting) and decides if this is an expense log or a command like “/add budget 500.”

The workflow detects the input type. Text gets sent straight to AI extraction. Voice notes are fetched from Telegram first, then analyzed. Receipt photos go through “pick best photo,” normalization, then image analysis (OCR-style parsing).

AI extracts structured fields you can actually use. The output is normalized and parsed into consistent JSON, then the workflow validates that it found at least one expense. If you wrote multiple items, it splits them into separate rows so your sheet stays tidy.

Google Sheets is updated and you get a clean confirmation. Expenses are appended as rows, budgets can be updated in a separate tab, and Telegram replies with success (or a helpful error). A reporting token + wait logic makes sure you get one summary after about 30 minutes of inactivity, not constant pings.

You can easily modify categories to match your chart of accounts based on your needs. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Telegram Trigger

This workflow starts when a user sends a Telegram message (text, photo, or voice) to your bot.

  1. Add and open Telegram Incoming Trigger.
  2. Credential Required: Connect your telegramApi credentials.
  3. Keep Updates set to message to capture text, photo, and voice inputs.
  4. Verify the trigger is connected to User Config Settings as shown in the execution flow.
If Telegram messages do not arrive, re-check your bot token and webhook setup inside the Telegram Incoming Trigger node.

Step 2: Connect Google Sheets

The workflow logs expenses, budget updates, and daily report data to Google Sheets.

  1. Open User Config Settings and set your sheet IDs: spreadsheet_id to Input your Spread Sheet ID here (replace with your actual ID), sheet_gid_log to gid=0 (or your log sheet ID), sheet_gid_dashboard to Input your Sheet "Dashboard" ID here, and sheet_gid_budget to Input your Sheet "Budget Topups" ID here.
  2. In Fetch Sheet Rows for Dedup, confirm the Document is {{ $('User Config Settings').item.json.spreadsheet_id }} and Sheet is {{ $('User Config Settings').item.json.sheet_gid_log }}.
  3. In Append Rows to Sheet, verify column mappings like Date{{ $json.date }} and Update_ID{{ $json.update_id }}.
  4. In Fetch Daily Report Range, set Range to D1:I2.
  5. In Update Budget Sheet Row, keep operation as append and verify sheetName uses {{ Number($('User Config Settings').item.json.sheet_gid_budget) }}.
  6. Credential Required: Connect your googleSheetsOAuth2Api credentials to all Google Sheets nodes (including Fetch Sheet Rows for Dedup, Append Rows to Sheet, Fetch Daily Report Range, and Update Budget Sheet Row).
⚠️ Common Pitfall: Make sure your GID values are actual sheet IDs (numeric) and not tab names. Incorrect GIDs will cause empty reads or append failures.

Step 3: Configure Routing and Deduplication

Incoming messages are deduplicated and routed by command and content type.

  1. In Command Routing Switch, keep the regex checks for budget commands: /^\/add(?:@\w+)?\s+budget\b/i.test(($json.message?.text || '').trim()).
  2. Confirm Fetch Sheet Rows for Dedup filters by Update_ID using {{ $json.update_id }}, then passes into Duplicate Check Branch.
  3. In Duplicate Check Branch, ensure the condition checks {{ $json.Message_ID }} for non-empty so duplicates are blocked.
  4. Verify Script Restore Telegram Data restores the original Telegram JSON so Route by Input Type can inspect message.voice, message.photo, and message.text.
  5. Confirm Route by Input Type outputs to Assign Voice Context, Assign Photo Context, or Assign Text Context based on message type.

Step 4: Set Up AI Processing (Gemini Text, Image, Audio)

Gemini nodes extract structured expense data from text, receipt photos, and voice notes.

  1. In Assign Text Context, ensure raw_input is {{ $json.message.text }} and now uses {{ $now.setZone('Asia/Ho_Chi_Minh').toFormat('yyyy-LL-dd HH:mm:ss') }}.
  2. In Assign Photo Context, keep caption and raw_input as {{ $json.message.caption || "[photo]" }}.
  3. In Assign Voice Context, keep file_id as {{ $json.message.voice.file_id }} and raw_input as [voice].
  4. Credential Required: Connect your googlePalmApi credentials in Gemini Text Extraction, Gemini Image Analysis, and Gemini Audio Analysis.
  5. Verify Gemini Text Extraction uses model models/gemini-2.5-flash and includes the prompt containing {{ $json.now }} and {{ $('User Config Settings').item.json.currency_code }}.
  6. Ensure Gemini Image Analysis uses resource image, inputType binary, and the receipt extraction prompt.
  7. Ensure Gemini Audio Analysis uses resource audio, inputType binary, and the transcription + extraction prompt.
The normalization nodes (Script Normalize Text Output, Script Normalize Image Output, Script Normalize Audio Output) standardize Gemini output for downstream parsing—keep them connected as-is.

Step 5: Process Expenses and Write to Sheets

Parsed expenses are validated, split into rows, and appended to your log sheet, then a report token is created.

  1. Keep Script Parse Gemini JSON connected after each normalize node to validate strict JSON from Gemini.
  2. In Validate Expenses Present, retain the condition {{ ($json.expenses || []).length > 0 }}.
  3. Validate Expenses Present outputs to both Script Split Expense Items and Telegram Success Reply in parallel.
  4. In Append Rows to Sheet, confirm column mappings for Item, Amount, Category, and Payment_Method match your sheet headers.
  5. Ensure Script Create Report Token follows Append Rows to Sheet and feeds Report Token Table.

Step 6: Configure Budget Command Handling

Budget updates are parsed from the “/add budget” command and written to a separate sheet.

  1. Keep Command Routing Switch connected to Script Parse Budget Value for the budget command branch.
  2. In Script Parse Budget Value, leave the parsing logic as-is and ensure it uses {{ $('User Config Settings').item.json.currency_symbol }}.
  3. Verify Budget Validation Check evaluates {{ $json.ok }} as a boolean.
  4. In Update Budget Sheet Row, ensure ts uses {{ new Date().toLocaleString('vi-VN', { timeZone: 'Asia/Ho_Chi_Minh' }) }}.
  5. Confirm success and error replies are handled by Telegram Budget Updated and Telegram Budget Error.

Step 7: Schedule and Send Daily Reports

After logging expenses, a report token is stored and a delayed check determines whether to send a daily report.

  1. In Report Token Table, set dataTableId to your actual Data Table ID (replace [YOUR_ID]).
  2. Ensure Report Token TableDelay Timer remains in place, and Delay Timer uses amount 30 and unit minutes.
  3. Update Data Table Fetch Rows and Data Table Remove Rows to use the same Data Table ID as Report Token Table.
  4. Confirm Script Verify Latest Token checks {{ $node["Delay Timer"].json.report_token }} and passes to Conditional Send Gate.
  5. When Conditional Send Gate is true, ensure it flows to Data Table Remove RowsFetch Daily Report RangeScript Build Daily ReportTelegram Send Daily Report.
⚠️ Common Pitfall: If all three Data Table nodes do not use the same dataTableId, report scheduling will fail and no daily report will be sent.

Step 8: Configure Telegram Responses

Telegram nodes send confirmation, error, and report messages back to the user.

  1. Credential Required: Connect your telegramApi credentials to all Telegram nodes (including Telegram Success Reply, Telegram Error Reply, Telegram Budget Updated, Telegram Budget Error, Telegram Fetch Voice File, Telegram Fetch Image File, and Telegram Send Daily Report).
  2. In Telegram Success Reply, keep text as {{ $json.summary_text }} and chatId as {{ $json.chat_id }}.
  3. In Telegram Error Reply, keep text as ⚠️ Could not understand expenses in: "{{$json.raw_input}}" and chatId as {{ $('Telegram Incoming Trigger').item.json.message.chat.id }}.
  4. In Telegram Send Daily Report, keep chatId as {{ $node["Telegram Incoming Trigger"].json.message.chat.id }}.

Step 9: Test and Activate Your Workflow

Run end-to-end tests with different input types and confirm the correct responses, sheet updates, and report scheduling.

  1. Click Execute Workflow and send a test Telegram message: a text expense like Lunch 10k, a receipt photo, and a voice note.
  2. Confirm Route by Input Type routes correctly and Gemini nodes produce structured JSON that passes Validate Expenses Present.
  3. Verify new rows appear in the log sheet from Append Rows to Sheet and budget entries append in Update Budget Sheet Row when using /add budget 500k.
  4. Check Telegram replies from Telegram Success Reply, Telegram Error Reply, Telegram Budget Updated, and Telegram Budget Error.
  5. Wait 30 minutes (or temporarily reduce the Delay Timer to 1 minute) and confirm a daily report is sent by Telegram Send Daily Report when the token matches.
  6. When everything works, switch the workflow to Active to enable production use.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Common Gotchas

  • Telegram credentials can expire or the bot can lose permissions. If things break, check your Telegram bot token in n8n credentials and confirm the bot is still in the right chat.
  • If you’re using Wait nodes or external processing (voice/photo analysis), processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
  • Default prompts in AI nodes are generic. Add your brand voice (categories, merchant rules, “what counts as an expense”) early or you’ll be editing outputs forever.

Frequently Asked Questions

How long does it take to set up this Telegram Sheets expenses automation?

About 45 minutes if you already have Telegram and Google Sheets ready.

Do I need coding skills to automate Telegram Sheets expenses?

No. You’ll mostly connect accounts and paste in a few IDs from your Google Sheet.

Is n8n free to use for this Telegram Sheets expenses workflow?

Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Gemini API costs (it’s currently free or very cheap for many use cases).

Where can I host n8n to run this automation?

Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.

Can I customize this Telegram Sheets expenses workflow for different categories and currencies?

Yes, and you should. Update the defaults in the “CONFIG – User Settings” node (currency code, symbol, locale) and adjust the AI extraction prompt in the Gemini text/image/audio nodes to match your category list. Common tweaks include adding “Client meals” vs “Team meals,” forcing certain merchants into fixed categories, and setting a default currency for ambiguous amounts.

Why is my Telegram connection failing in this workflow?

Usually it’s an expired bot token or the wrong chat context. Re-check your Telegram credentials in n8n, then confirm the bot can still receive messages from the chat you’re testing in. If voice/photo steps fail, it can also be Telegram file access not returning properly, so look at the Telegram “fetch file” nodes first. And yes, rate limits happen, especially if you dump a bunch of photos at once.

How many expenses can this Telegram Sheets expenses automation handle?

A lot. On n8n Cloud Starter you’re limited by monthly executions, while self-hosting is mainly limited by your server and API quotas. In practice, this workflow is fine for personal use and small teams logging dozens of expenses per day, even with receipt photos.

Is this Telegram Sheets expenses automation better than using Zapier or Make?

Often, yes. This workflow isn’t just “send a message to a sheet.” It routes different input types, calls AI for extraction, splits multiple items, de-dupes against existing rows, and runs a debounce-style daily report using a data table and a wait timer. That kind of logic is doable in Zapier or Make, but it tends to get expensive and fiddly as soon as you add branching and storage. If you only need a simple two-step “Telegram text → one row,” other tools can be quicker. Talk to an automation expert if you want a recommendation for your exact setup.

Once this is running, expense tracking stops being a “task” and becomes a quick message you barely think about. The workflow handles the repetitive cleanup, and your Google Sheet stays ready for real decisions.

Need Help Setting This Up?

Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal