Back to AutomationsMid-Size Company

Automating Multi-Department Expense Approvals: From 5 Days to 24 Hours

Automated expense report routing and approval workflow for 150+ monthly submissions across 8 departments using Google Workspace.

December 22, 2025

Difficulty

Intermediate

Time Required

8-16 hours

Technologies

4 Tools

The Challenge

Manual expense routing caused 2.5-day delays, audit trails were non-existent, 15% duplicate submissions occurred, and approval thresholds were applied incorrectly 20% of the time.

The Solution

Built an automated system that routes expenses to the correct manager based on amount thresholds, sends approval notifications, and maintains complete audit logs.

The Outcome

Reduced approval time from 5 days to 24 hours while eliminating manual routing errors and creating auditable approval records.

Technologies Used
multi-department expense approval workflowGoogle Workspace expense approval automationApps Script approval process automationcross-department budget approval system

Automating Multi-Department Expense Approvals: From 5 Days to 24 Hours

Your finance team spends 12 hours a month playing email traffic cop with expense reports. This automation routes 150+ monthly submissions to the right manager based on amount thresholds, sends approval notifications, and logs every decision for audit. Built entirely in Google Workspace.

The Problem

Manual routing burns time: Finance manually forwarded expenses to 8 different department managers. Average delay: 2.5 days before an expense reached the right inbox.

Audit trails don't exist: Approval decisions lived in email threads and sticky notes. When compliance asked "who approved the $2,400 software purchase in March?" the finance team spent 3 hours reconstructing history from Gmail searches.

Duplicate submissions: Employees resubmitted expenses when status updates went silent. 15% of Q2 submissions were duplicates, creating extra processing work and confusion.

Threshold confusion: CFO wanted $500+ expenses routed to department heads, $2,500+ to finance director. The manual system got this wrong 20% of the time—small purchases escalated unnecessarily, large ones slipped through to junior approvers.

No notification system: Managers missed 30% of approval requests buried in their inbox. Expenses stalled for days until employees followed up via Slack.

The Solution

A Google Forms intake connected to Apps Script triggers that route submissions based on amount and department. When an employee submits an expense, the script checks the amount, copies the data to the appropriate manager's approval sheet, emails the manager, and logs everything in an audit trail. When a manager updates the status column, another trigger notifies finance and the employee.

Core tools: Google Forms (intake), Apps Script (routing logic and notifications), Google Sheets (approval queues and audit log), MailApp (notifications).

Results: Finance team went from 12 hours/month of manual routing to zero. Average approval cycle dropped from 5 days to 24 hours.

Architecture

Implementation

Prerequisites

// Required OAuth scopes in appsscript.json:
// - https://www.googleapis.com/auth/spreadsheets
// - https://www.googleapis.com/auth/forms
// - https://mail.google.com/
// Editor access on master spreadsheet required
// Manager emails stored in PropertiesService for easy updates

Core Routing Logic

// Pseudo code for the application 
FUNCTION routeExpenseSubmission(formEvent)
  GET Sheets [Responses, AuditLog]
  
  GET Submission Data [Time, Employee, Dept, Amount, Category, Receipt, Notes]
  VALIDATE Data (Amount, Dept)
  
  DETERMINE Target Sheet & Approver:
    IF Amount < 500: Department Manager
    ELSE IF Amount < 2500: Director
    ELSE: Finance Director
    
  GET Approver Email from Config
  
  APPEND Expense to Approver Sheet
  APPEND to Audit Log "Submitted"
  
  CALL sendApprovalNotification(ApproverEmail, ...Details)
END FUNCTION
 
FUNCTION sendApprovalNotification(email, employee, amount, category, url, id)
  SEND Email to Approver
    SUBJECT: "Approval Needed: {Employee} - ${Amount}"
    BODY: "Review expense ID {id}. details..."
END FUNCTION
 
FUNCTION logErrorToSheet(error, functionName, args)
  GET OR CREATE Sheet '_ErrorLog'
  APPEND [Timestamp, Function, Error, Stack]
END FUNCTION

Status Change Monitoring

// Pseudo code for the application 
FUNCTION onStatusChange(changeEvent)
  IF Change is not in 'Status' Column THEN RETURN
  
  GET Updated Status, Submission ID, Employee, Amount
  
  IF Status is 'Approved' OR 'Rejected':
    APPEND to Audit Log [ID, Date, Status, Amount]
    
    GET Employee Email
    SEND Notification "Expense {Status}"
END FUNCTION

Setup Steps

  1. Create the intake form: Build a Google Form with fields for employee name, department dropdown (Sales, Engineering, Marketing, etc.), amount (number validation 0-10,000), category dropdown (Travel, Software, Supplies), and file upload for receipt.

  2. Set up approval sheets: Create four sheets in your master spreadsheet: "Form Responses" (auto-created by Forms), "Director Approvals", "Finance Director", and "Audit Log". Add manager sheets per department (e.g., "Sales Manager"). Include columns: Submission ID, Timestamp, Employee, Department, Amount, Category, Receipt URL, Status, Manager Notes, Approval Date.

  3. Configure script properties: In Apps Script editor, go to Project Settings > Script Properties. Add manager email addresses: Sales manager, director_email, finance_director, admin_email. This lets you update approvers without touching code.

  4. Install the triggers: In Apps Script editor, click Triggers (clock icon) > Add Trigger. Create two triggers: (1) routeExpenseSubmission, "From spreadsheet", "On form submit". (2) onStatusChange, "From spreadsheet", "On change". The first fires when employees submit forms, the second when managers update status columns.

  5. Test the routing: Submit test expenses at $300, $1,200, and $3,000. Verify each lands in the correct sheet and triggers the right email notification. Check audit log for proper timestamp recording and _ErrorLog sheet for any issues.

  6. Share sheets with managers: Give editors access to department managers on their respective sheets only. Finance director gets view access to all sheets plus the audit log.

Troubleshooting

Emails not sending: Apps Script has a daily MailApp quota of 100 emails for free Google accounts, 1,500 for Workspace accounts (Apps Script quotas). With 150+ monthly submissions, you'll hit this limit. Switch to daily digest emails: batch pending approvals into a single morning email per manager using a time-driven trigger.

Script timeout errors: Apps Script execution limit is 6 minutes per run (Apps Script execution limits). Processing 50+ forms at once causes timeouts. Add a lock service wrapper to prevent concurrent executions, or switch to hourly time-based triggers that process changes in batches.

Duplicate detection failing: The form itself can't prevent duplicates—it only validates the current submission. Add a pre-check function that queries the responses sheet for matching employee + amount + category submitted within the last 7 days. Flag potential duplicates in the manager sheet with conditional formatting for manual review before approval.

Missing script properties error: If routeExpenseSubmission throws "Manager email not configured", verify all required properties are set in Project Settings > Script Properties. Each department needs a corresponding {Department}_manager property, plus director_email, finance_director, and admin_email for error notifications.

Ready to Deploy?

You've got the code. Spend a weekend wiring this up yourself, or we'll have it running in your workspace by Friday—customized to your department structure, threshold rules, and notification preferences.

Our Automated Approval Engine includes your specific routing logic, custom email templates, and integration with your finance system (QuickBooks, Xero, NetSuite).

Need this for your team? Book a 30-minute call. 30-day code warranty.

Need a Custom Automation Solution?

We specialize in building tailored Google Workspace automations for businesses of all sizes. Let us help you eliminate repetitive tasks and streamline your workflows.