Telegram + Google Sheets: approved expenses, logged
Expense tracking falls apart in the tiny gaps. A receipt comes in while you’re on the move, you “mentally note it,” then your spreadsheet stays empty until it’s too late.
Freelancers feel it at tax time. A small business owner feels it when cash gets tight. And a financial assistant ends up chasing people for details. This Telegram expense logging automation puts every transaction into Google Sheets with an approval step, so nothing “disappears” between chat messages and month-end.
You’ll see how the workflow captures income and expenses in Telegram, validates the format, logs it to the right sheet tab, then routes expenses to a supervisor for Approve, Reject, or View Details.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Telegram + Google Sheets: approved expenses, logged
flowchart LR
subgraph sg0["Telegram - Incoming Webhook Flow"]
direction LR
n0["<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/telegram.svg' width='40' height='40' /></div><br/>Telegram - Incoming Webhook"]
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/code.svg' width='40' height='40' /></div><br/>Detect Message Type"]
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by Input Type", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Handle /start or Message Input", pos: "b", h: 48 }
n4["<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/telegram.svg' width='40' height='40' /></div><br/>Show Income/Expense Options"]
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/>Validate Input Format"]
n6["<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/>Extract Data Type"]
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route Based on Data Type", 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/>Parse Income Data"]
n9@{ icon: "mdi:database", form: "rounded", label: "Save Income to Sheet", pos: "b", h: 48 }
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/telegram.svg' width='40' height='40' /></div><br/>Notify User Income Recorded"]
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/code.svg' width='40' height='40' /></div><br/>Parse Expense Data"]
n12@{ icon: "mdi:database", form: "rounded", label: "Save Expense to Sheet", 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/telegram.svg' width='40' height='40' /></div><br/>Notify User Expense Pending"]
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/telegram.svg' width='40' height='40' /></div><br/>Send Approval Request"]
n15["<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/>Parse Callback Response"]
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route Based on Callback Type", pos: "b", h: 48 }
n17@{ icon: "mdi:database", form: "rounded", label: "Update Approval Status", pos: "b", h: 48 }
n18@{ icon: "mdi:database", form: "rounded", label: "Get Approved Row", pos: "b", h: 48 }
n19["<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/telegram.svg' width='40' height='40' /></div><br/>Notify User of Approval Result"]
n20@{ icon: "mdi:database", form: "rounded", label: "Get Row for Detail View", pos: "b", h: 48 }
n21["<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/>Format Expense Detail Message"]
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/telegram.svg' width='40' height='40' /></div><br/>Send Expense Detail to Super.."]
n23["<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/>Show Income Input Format"]
n24["<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/>Show Expense Input Format"]
n25["<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/telegram.svg' width='40' height='40' /></div><br/>Send Income Format Message"]
n26["<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/telegram.svg' width='40' height='40' /></div><br/>Send Expense Format Message"]
n18 --> n19
n6 --> n7
n8 --> n9
n11 --> n12
n1 --> n2
n2 --> n3
n2 --> n15
n9 --> n10
n12 --> n13
n5 --> n6
n17 --> n18
n20 --> n21
n15 --> n16
n7 --> n8
n7 --> n11
n23 --> n25
n24 --> n26
n13 --> n14
n0 --> n1
n16 --> n17
n16 --> n20
n16 --> n23
n16 --> n24
n21 --> n22
n3 --> n4
n3 --> n5
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 n0 trigger
class n2,n3,n7,n16 decision
class n9,n12,n17,n18,n20 database
class n1,n5,n6,n8,n11,n15,n21,n23,n24 code
classDef customIcon fill:none,stroke:none
class n0,n1,n4,n5,n6,n8,n10,n11,n13,n14,n15,n19,n21,n22,n23,n24,n25,n26 customIcon
The Problem: Expense tracking that depends on memory
Most “systems” for expenses are really just good intentions. Someone pays for something, tosses the receipt in a bag, and sends a quick message like “Taxi 18” or “Client lunch” with no context. Later, you open the spreadsheet and realize half the details are missing, some transactions were never recorded, and nobody remembers what was business vs. personal. It’s not only slow. It’s stressful, because every missing line item turns into back-and-forth, guessing, and last-minute cleanup.
The friction compounds. Here’s where it breaks down in real life.
- You spend about 5 minutes per transaction translating casual chat messages into spreadsheet-ready entries.
- Approvals happen in scattered places, so you can’t tell what’s final vs. still pending.
- Formatting is inconsistent, which leads to wrong categories, duplicate rows, and messy closeouts.
- Someone inevitably asks for “the status” and you end up manually checking the sheet and replying.
The Solution: Log transactions in Telegram, approve in one tap
This workflow turns Telegram into a lightweight finance intake form that people will actually use. A user starts the bot with /start, taps whether they’re logging income or an expense, then submits the transaction in a structured format (so details don’t get lost). n8n checks the message, parses the key fields, and writes the row into Google Sheets immediately. If it’s income, the user gets an instant confirmation and you’re done. If it’s an expense, the workflow marks it as pending, pings a supervisor in Telegram, and offers inline buttons to Approve ✅, Reject ❌, or View Details 👁. The user gets a clear outcome message once the supervisor decides.
The workflow starts with a Telegram Bot Trigger that captures messages and button clicks. It then routes based on message type (start, text input, or supervisor callback), writes or updates the correct row in Google Sheets, and sends the right notification back to the right person.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your team records 20 expenses a week. Manually, it’s usually “find the message, ask for missing details, enter the row, then update status later,” which is easily 5 minutes each, or about 2 hours weekly. With this workflow, logging is a quick Telegram message (call it 1 minute), and supervisor approval is a single tap when they see the prompt. You still wait for the decision, but you’re not doing the chasing or data entry.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram Bot for transaction intake and approvals
- Google Sheets to store income and expense records
- Google OAuth2 credentials (create in Google Cloud Console)
Skill level: Beginner. You’ll connect accounts, paste a bot token, and update a sheet ID and supervisor chat ID.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Telegram message or button click triggers the workflow. The Telegram Bot Trigger captures both typed messages and inline button callbacks, which means the same automation handles intake and supervisor decisions.
The workflow figures out what kind of input it received. It separates “/start,” regular text submissions, and callback actions, then routes each one down the correct path so users aren’t stuck in the wrong menu.
Structured text gets validated and parsed into clean fields. A small set of logic nodes checks formatting, detects whether it’s income or expense, and extracts details that Google Sheets can store consistently.
Google Sheets is updated and the right people are notified. Income is appended to the income worksheet and confirmed back to the user. Expenses are logged to your expense tab, marked pending, and sent to a supervisor who can approve, reject, or request details without leaving Telegram.
You can easily modify the supervisor routing to support multiple approvers or different departments based on category. 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 Telegram message or callback is received by Telegram Webhook Intake.
- Add and open Telegram Webhook Intake.
- Connect the Telegram bot that will receive messages and callbacks.
- Save the node so n8n registers the Telegram webhook.
Step 2: Connect Google Sheets
The workflow writes and updates finance records in Google Sheets using multiple sheet nodes for income, expenses, and approvals.
- Open Log Income to Sheet and select the spreadsheet and worksheet where income should be stored.
- Open Log Expense to Sheet and select the expense worksheet for pending expenses.
- Open Modify Approval Status, Retrieve Approved Row, and Fetch Row for Detail View to point to the same approval tracking sheet.
- Ensure all Google Sheets nodes map to the same structure (columns for date, category, amount, notes, and approval status).
Step 3: Set Up Message Classification & Routing
Incoming messages are categorized and routed through the core processing path for income/expense parsing.
- Review Identify Message Category to confirm it categorizes Telegram updates correctly before the workflow reaches Direct by Input Kind.
- Configure Direct by Input Kind to split between messages and callback queries, sending message flow to Process Start or Text and callback flow to Decode Callback Response.
- Set Process Start or Text to route text entries to Verify Input Structure and start messages to Display Income Expense Menu.
- In Verify Input Structure and Derive Data Category, validate input format and set the category before passing to Switch by Data Category.
Step 4: Configure Income/Expense Logging & Notifications
The income and expense paths parse the message, log data to sheets, and send confirmation messages.
- Ensure Switch by Data Category routes income to Interpret Income Details and expenses to Interpret Expense Details.
- In Interpret Income Details, map output fields expected by Log Income to Sheet.
- In Interpret Expense Details, map output fields expected by Log Expense to Sheet.
- Configure Confirm Income Logged to send a success message after Log Income to Sheet.
- Configure Alert Expense Pending to notify the user that approval is required after Log Expense to Sheet.
- Confirm Alert Expense Pending routes to Dispatch Approval Prompt to request supervisor approval.
Step 5: Configure Callback Approval & Detail Views
Callback buttons are decoded to update approval status, show detail views, and send format tips.
- In Decode Callback Response, parse callback data so Switch by Callback Type can route each action.
- Ensure Switch by Callback Type routes approvals to Modify Approval Status, then to Retrieve Approved Row, then to Send Approval Outcome.
- Ensure Switch by Callback Type routes detail requests to Fetch Row for Detail View, then to Compose Expense Detail, then to Notify Supervisor Detail.
- Confirm that Present Income Format → Send Income Format Tip and Present Expense Format → Send Expense Format Tip are wired for help messages.
Step 6: Test and Activate Your Workflow
Validate message intake, logging, and approval callbacks before enabling the workflow in production.
- Click Execute Workflow and send a Telegram message to the bot to trigger Telegram Webhook Intake.
- Confirm the message passes through Identify Message Category → Direct by Input Kind → Process Start or Text and reaches Display Income Expense Menu or Verify Input Structure.
- Submit an income entry and verify Log Income to Sheet writes to your sheet and Confirm Income Logged returns a success message.
- Submit an expense entry and verify Log Expense to Sheet writes to your sheet and Alert Expense Pending → Dispatch Approval Prompt sends the approval request.
- Click an approval callback and ensure Modify Approval Status → Retrieve Approved Row → Send Approval Outcome completes the approval flow.
- When satisfied, toggle Active to enable the workflow for continuous use.
Common Gotchas
- Telegram credentials can fail if the bot token was regenerated. If messages stop arriving, check your n8n Telegram API credential and the BotFather token first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Google Sheets updates can silently miss the right row if your sheet structure changes. If approvals update the wrong line, check the “Modify Approval Status” mapping and confirm the correct spreadsheet tab name.
Frequently Asked Questions
About 30 minutes if your Telegram bot and Google access are ready.
No. You will mainly connect accounts and paste in IDs and tokens.
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 Google Workspace access (if applicable), but this workflow doesn’t require paid AI calls to function.
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.
Yes, but you’ll want to adjust the “Dispatch Approval Prompt” logic to choose the right supervisor chatId based on category, team, or who submitted the expense. Many teams keep a simple mapping table in Google Sheets and look up the approver before sending the approval buttons.
Usually it’s an invalid or replaced bot token, so n8n can’t authenticate to Telegram anymore. Update the Telegram API credential in n8n, then send /start to the bot again to confirm messages are arriving. If you run the bot in a group chat, privacy mode can also interfere with what the bot can “see,” so check your BotFather settings. And if approvals aren’t reaching the supervisor, verify the supervisor chatId in the node that sends the approval request.
Plenty for most small teams: think hundreds of transactions a month without drama. On n8n Cloud, your limit depends on plan executions; if you self-host, it’s mostly your server size and Google Sheets API limits.
Often, yes, because the approval flow needs branching, callbacks, and row updates that get awkward (and expensive) in simpler automation tools. n8n handles multi-path logic cleanly, and self-hosting is an option if you want unlimited runs. Zapier or Make can still work if you only want “Telegram message → add spreadsheet row” with no supervisor loop. This template’s value is the decision step, honestly. Talk to an automation expert if you want help choosing the simplest setup for your team.
Once this is running, expenses stop living in people’s heads and chat history. The workflow keeps the records clean, and your approvals stop being a scavenger hunt.
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.