Slack to Google Sheets, effortless expense tracking
You know that moment when you swear you’ll log an expense later… and then it’s three days later, your spreadsheet is wrong, and you’re trying to remember what “₹320 ???” even was.
Slack expense tracking hits busy people hardest: founders who pay from three places, consultants who spot-reimburse client charges, and marketers who run small ad tests and want clean numbers. The goal is simple. Capture transactions the second they happen, without turning your life into a data-entry job.
This n8n workflow turns Slack into a conversational finance tracker, then updates Google Sheets only after you approve a clean preview. You’ll see what it automates, what you get back, and how to set it up without drowning in setup details.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Slack to Google Sheets, effortless expense tracking
flowchart LR
subgraph sg0["Bot Mention Flow"]
direction LR
n5@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n6@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n7@{ icon: "mdi:wrench", form: "rounded", label: "Think", pos: "b", h: 48 }
n8@{ icon: "mdi:wrench", form: "rounded", label: "Calculator", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Get Balances", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Get Transactions", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Get Debts", pos: "b", h: 48 }
n12@{ icon: "mdi:memory", form: "rounded", label: "Postgres Chat Memory", 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/slack.svg' width='40' height='40' /></div><br/>replying to the user"]
n14@{ icon: "mdi:database", form: "rounded", label: "Adding/updating Transactions", pos: "b", h: 48 }
n15@{ icon: "mdi:database", form: "rounded", label: "Adding/updating debts", pos: "b", h: 48 }
n16@{ icon: "mdi:database", form: "rounded", label: "Adding/updating balances", pos: "b", h: 48 }
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/slack.svg' width='40' height='40' /></div><br/>Bot Mention trigger"]
n7 -.-> n5
n5 --> n13
n11 -.-> n5
n8 -.-> n5
n9 -.-> n5
n10 -.-> n5
n18 --> n5
n12 -.-> n5
n15 -.-> n5
n16 -.-> n5
n6 -.-> n5
n14 -.-> n5
end
subgraph sg1["Daily checkin Flow"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Get Current Balance", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Get Active Debts", pos: "b", h: 48 }
n2["<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 Daily Message"]
n3["<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/slack.svg' width='40' height='40' /></div><br/>Send Slack Message"]
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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n17@{ icon: "mdi:play-circle", form: "rounded", label: "Daily checkin trigger", pos: "b", h: 48 }
n4 --> n2
n1 --> n4
n0 --> n4
n2 --> n3
n17 --> n0
n17 --> 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 n18,n17 trigger
class n5 ai
class n6 aiModel
class n7,n8 ai
class n12 ai
class n9,n10,n11,n14,n15,n16,n0,n1 database
class n2 code
classDef customIcon fill:none,stroke:none
class n13,n18,n2,n3,n4 customIcon
The Problem: Expense tracking falls apart in the small moments
Expense tracking usually doesn’t fail because you don’t care. It fails because it asks for “later time” that never shows up. A coffee paid in cash, a quick online subscription, a friend you spot for dinner, and suddenly you’re juggling cash vs. online balances plus informal debts. The spreadsheet becomes a chore, then a guilt-trip, then a mess. Worst part: once the numbers drift, you stop trusting them, so you check bank apps more, not less. That’s real mental load.
It adds up fast. Here’s where it breaks down in real life.
- You forget expenses because they happen between meetings, errands, and everything else.
- Cash and online spending blur together, so your “available” balance is basically a guess.
- Debt tracking turns into awkward memory games, especially when repayments happen days later.
- Manual spreadsheet updates invite errors, and one wrong row poisons your totals for weeks.
The Solution: Log in Slack, approve once, and let Sheets stay accurate
This workflow turns a Slack channel into your finance inbox. You mention the bot with a plain-English transaction like “₹500 cash food” or “borrowed ₹1000 from John,” and an AI agent interprets what you meant. It reads your current balances and active debts from Google Sheets, calculates the updated balances, then sends you a preview inside Slack before anything is written. If you reply “yes,” the workflow logs the transaction with a unique ID and timestamp, updates any debt records (including settled vs. active), and writes the latest balances back to your Balances tab. If you reply “no,” it drops it. No damage.
It also runs a daily check-in at 11 PM. That scheduled branch pulls your latest balances and debts, formats a short summary, and nudges you to log anything you missed so you don’t wake up to mystery numbers.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you log 5 transactions a day (a couple cash, a couple online, plus one “lent/borrowed” situation). Manually, it’s easy to spend about 3 minutes per entry in a spreadsheet once you include category, payment type, and fixing typos, which is roughly 15 minutes a day. With this workflow, you send one Slack message per transaction, skim the preview, and reply “yes,” so it’s closer to a minute each. Over a week, that’s around an hour back, and your balances don’t quietly drift.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Slack as your transaction capture interface.
- Google Sheets to store balances, transactions, and debts.
- Google Gemini API key (get it from ai.google.dev)
Skill level: Intermediate. You’ll connect Slack + Google credentials and match the sheet tabs/headers exactly, but you won’t be writing code.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A daily check-in pings you at night. At 11 PM, the scheduled trigger fetches your current balances and active debts from Google Sheets, then posts a neat summary to Slack.
You mention the bot with a transaction. The Slack mention listener starts the workflow only when you use an app mention (so normal messages don’t accidentally trigger it).
The AI interprets what you meant and calculates changes. The agent parses amount, category (food, travel, utilities, etc.), payment type (cash/online), and also detects debt actions like “lent,” “borrowed,” or “repaid.” Then it reads your current rows from Sheets and prepares updated balances and debt status.
You approve, then it writes to Sheets. You get a preview in Slack. Reply “yes” and it upserts transaction, debt, and balance records into the right tabs, with IDs and timestamps included.
You can easily modify the categories and approval keywords to match how you talk in Slack. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
Set the daily schedule so the workflow checks balances and active debts at a fixed time.
- Open Scheduled Finance Check and confirm the schedule rule is set to run at
23(hour of day). - Verify the trigger has two outputs: it should send data to both Fetch Balance Snapshot and Retrieve Active Debt List.
Scheduled Finance Check outputs to both Fetch Balance Snapshot and Retrieve Active Debt List in parallel.
Step 2: Connect Google Sheets
Wire your finance spreadsheets so the workflow can read balances and debts and later update records via AI tools.
- Open Fetch Balance Snapshot and select the Google Sheet Document and Sheet Name. Set the range to
A:D. - Open Retrieve Active Debt List and select the Google Sheet Document and Sheet Name. Set the range to
A:F. - Credential Required: Connect your googleSheetsOAuth2Api credentials on Fetch Balance Snapshot and Retrieve Active Debt List.
- Group-apply the same Google Sheets credentials to all Google Sheets tool nodes used by the AI (6 nodes total): Fetch Balance Rows, Fetch Transaction Rows, Fetch Debt Rows, Upsert Transaction Records, Upsert Debt Records, and Upsert Balance Records.
⚠️ Common Pitfall: Leaving Document or Sheet Name blank will cause empty data in Craft Daily Summary and incomplete Slack updates.
Step 3: Set Up the Daily Summary Processing
Merge the balance and debt datasets and build the summary message that will post to Slack.
- Ensure Combine Data Streams receives inputs from both Fetch Balance Snapshot and Retrieve Active Debt List.
- Open Craft Daily Summary and keep the JavaScript code intact to calculate balances, active debts, and message formatting.
- Confirm the output from Combine Data Streams feeds into Craft Daily Summary, then to Post Slack Update.
Step 4: Configure Slack Outputs
Set up Slack to post the daily summary and to respond to user interactions.
- In Post Slack Update, set Text to
={{ $json.message }}and select the destination Channel. - Credential Required: Connect your slackApi credentials on Post Slack Update.
- In Slack User Reply, set Text to
={{ $json.output }}and choose the same or a separate Channel. - Credential Required: Connect your slackApi credentials on Slack User Reply.
Step 5: Configure the Slack Mention Trigger
Allow users to mention your bot to log transactions through AI-assisted parsing.
- Open Slack Mention Listener and set the Trigger to
app_mention. - Select the Channel where finance mentions will be detected.
- Credential Required: Connect your slackApi credentials on Slack Mention Listener.
Step 6: Set Up the AI Orchestration Layer
Configure the AI agent and its tools so it can parse transactions, calculate balances, and update Google Sheets.
- Open Finance AI Orchestrator and set Text to
={{ $json.text }}. - Keep the System Message content intact, as it defines the parsing logic, approval flow, and tool usage.
- Connect Gemini Chat Engine as the language model for Finance AI Orchestrator. Credential Required: Connect your googlePalmApi credentials on Gemini Chat Engine.
- Attach Chat Memory Store as the memory for Finance AI Orchestrator. Credential Required: Connect your postgres credentials on Chat Memory Store.
- Confirm the AI tools are attached: Reasoning Helper, Math Utility, Fetch Balance Rows, Fetch Transaction Rows, Fetch Debt Rows, Upsert Transaction Records, Upsert Debt Records, and Upsert Balance Records.
Credential Note: AI tools such as Reasoning Helper, Math Utility, and the Google Sheets tool nodes inherit credentials from their own nodes, but are invoked by Finance AI Orchestrator. Ensure all tool nodes have the correct credentials even though they are not triggered directly.
Step 7: Verify the AI Update Actions
Ensure the append-or-update operations map correctly to your Google Sheets schema.
- In Upsert Transaction Records, confirm Operation is
appendOrUpdateand matching column isTransaction_ID. - In Upsert Debt Records, confirm Operation is
appendOrUpdateand matching column isPerson_Name. - In Upsert Balance Records, confirm Operation is
appendOrUpdateand matching column isDate. - Leave the AI-generated column expressions intact (for example,
={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Amount', ``, 'string') }}) so the agent can fill data dynamically.
Step 8: Test and Activate Your Workflow
Validate both the scheduled summary and the Slack mention workflow before enabling production runs.
- Click Execute Workflow to test Scheduled Finance Check and confirm a Slack summary posts through Post Slack Update.
- Send a Slack mention in the configured channel (e.g., “₹500 cash travel”) to trigger Slack Mention Listener and verify Slack User Reply responds with a preview or confirmation.
- Confirm Google Sheets updates appear in the Balances, Transactions, and Debts sheets after approval.
- When satisfied, toggle the workflow to Active for ongoing daily execution.
Common Gotchas
- Slack credentials can expire or need specific permissions. If things break, check your Slack app’s OAuth scopes and the Bot User OAuth 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.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About an hour if your Slack app and Google Sheet are ready.
No. You’ll connect accounts and paste in a few IDs/keys. The main “work” is making sure your Google Sheets tabs and headers match the template exactly.
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 Gemini API usage, which is typically small for short transaction messages.
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 change it in two places. Update the AI Agent’s instructions so it recognizes “credit card” (or specific cards) as a payment type, then expand the Balances tab and the balance calculation logic so those extra balances get updated correctly. Common tweaks include adding new categories, changing the 11 PM check-in time, and swapping the model node if you prefer a different AI provider.
Most of the time it’s an OAuth token issue or missing scopes on the Slack app. Double-check that the app has app_mentions:read and chat:write, then reinstall the app to the workspace if you changed permissions. Also confirm the bot is invited to the channel you’re using. If your Slack trigger isn’t firing, the Event Subscriptions webhook URL in Slack often points to an old n8n URL.
For personal use, it can handle plenty. On n8n Cloud’s entry plans you’ll typically have a monthly execution cap, and each logged message plus approval can count as separate executions depending on your setup. If you self-host, there’s no platform execution limit, so throughput mainly depends on your server and Google Sheets rate limits.
Often, yes. This workflow needs branching logic (preview, approve, then write), memory (so “yesterday’s transaction” makes sense), and multi-table upserts, and that gets expensive or awkward in simpler automation tools. n8n also gives you a real self-hosted path, which matters if you don’t want per-task pricing. If you only need “send Slack text into a sheet row,” Zapier or Make can be faster to set up. If you’re unsure, Talk to an automation expert and we’ll point you the right way.
Once this is running, your spreadsheet stops being a weekend project. You log life as it happens, approve in seconds, and your balances stay believable.
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.