Blog Post

How I Built a Personal Finance Dashboard with Google Sheets & Plaid API

The Death of Free Budgeting Apps

With the shutdown of legendary tools like Mint.com and the shift toward expensive monthly subscriptions for modern budgeting apps, managing your finances has ironically become a major expense. You sign up, link your bank accounts, and soon hit a paywall. Worse, your highly sensitive transaction data is now sitting on a third-party server being mined for targeted ads.

The solution? Build your own. In this technical guide, I’ll show you how to combine the raw flexibility of Google Sheets with the power of the Plaid API to create a dashboard that automatically imports your transactions, categorizes spending, and tracks your net worth—completely for free.

The Architecture: A Simple, Private Stack

To pull this off without paying for AWS servers, we use a fully serverless, Google-native stack:

  1. Plaid API: Plaid is the secure financial bridge used by Venmo and Robinhood. Their developer tier allows you to connect to up to 100 live bank accounts for personal use, completely free.
  2. Google Apps Script: This is our backend. It's a serverless JavaScript runtime built directly into Google Sheets. It will run on a daily cron job to securely fetch data from Plaid.
  3. Google Sheets: Our frontend dashboard, utilizing Pivot Tables and dynamic charts.

Step 1: Obtain Your Plaid API Keys

Create a developer account at Plaid.com. You will need your client_id and your Development secret_key. To securely connect your real bank accounts, you must go through the Plaid Link flow once locally to generate an access_token for your specific bank.

Step 2: The Google Apps Script Backend

Open a new Google Sheet, click Extensions > Apps Script, and write a function to communicate with Plaid's /transactions/sync endpoint. This endpoint is designed specifically to only pull new transactions since your last successful pull, saving API compute time.

function syncTransactions() {
  const CLIENT_ID = 'your_client_id';
  const SECRET = 'your_secret';
  const ACCESS_TOKEN = 'your_access_token';
  
  const payload = {
    client_id: CLIENT_ID,
    secret: SECRET,
    access_token: ACCESS_TOKEN,
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  };

  // Call the Plaid API
  const response = UrlFetchApp.fetch('https://development.plaid.com/transactions/sync', options);
  const data = JSON.parse(response.getContentText());

  // Append new transactions to the Sheet
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Transactions');
  data.added.forEach(tx => {
    sheet.appendRow([tx.date, tx.name, tx.amount, tx.category[0]]);
  });
}

Step 3: Automate and Visualize

Inside the Apps Script editor, click the clock icon (Triggers) and set syncTransactions to run daily between midnight and 1 AM. You now have a database that updates itself while you sleep.

Finally, build the frontend. In your Google Sheet, use the QUERY() function to filter your transactions by month, create a Pivot Table to sum your spending by category, and insert a Pie Chart. You are now the master of your own financial data, hosted on an infrastructure that will never charge you a monthly fee.