# 🏦 Budget & Bill Tracker – Premium Notion Template  

> **Goal:** End‑to‑end personal finance system that tracks every transaction, automates bill reminders, enforces budgets, and visualises cash‑flow & net‑worth without leaving Notion.  

---  

## 📖 Overview  

| ✅ Feature | 📌 What It Does |
|---|---|
| **All‑in‑one Dashboard** | Snapshot of upcoming bills, month‑to‑date spend, budget health, and net‑worth. |
| **Four Relational Databases** | `Transactions`, `Bills`, `Accounts`, `Budgets` (plus a read‑only `Categories` table). |
| **Dynamic Rollups & Formulas** | Running balance, budget variance, cash‑flow line, net‑worth total. |
| **Ready‑to‑Use Views** | Calendar, Table, Board, Gallery, and built‑in Notion charts (via **Synced Block** + **Notion Charts** embed). |
| **Automation Ready** | One‑click enable for Notion reminders, Zapier “New Bill → Transaction”, and optional Python API script. |
| **Premium Polish** | Callouts, emojis, colour‑coded tags, and a “Monthly Review” SOP that can be duplicated each month. |

> **Tip:** Duplicate the **Budget & Bill Tracker** page before you start customizing. All changes stay in your copy, preserving a clean master template.  

---  

## 📊 Dashboard (Page: **Budget Dashboard**)  

Create a page titled **Budget Dashboard** and add the following **linked views** (use the “Create linked database” block).  

| View | Source DB | Filter / Sort | Display | Notes |
|---|---|---|---|---|
| **🗓️ Upcoming Bills** | `Bills` | `Due Date` ≤ `dateAdd(now(), 7, "days")` • `Paid` = unchecked | Table (columns: Due Date, Vendor, Amount, Recurrence, **Account**, **Linked Transaction**) | Add a **Sort** on `Due Date` ascending. |
| **💸 Month‑to‑Date Spend** | `Transactions` | `Date` within this month | **Bar chart** (Budgeted vs. Spent per Category) – embed via **Notion Charts** (see “Reports & Insights”). |
| **📈 Cash‑Flow Timeline** | `Transactions` | none | **Line chart** – Running Balance over time (see formula below). |
| **🏦 Net‑Worth** | `Accounts` | none | **Number** – Rollup of `Current Balance`. |
| **📊 Budget vs. Actual** | `Budgets` | none | **Table** (columns: Category, Budgeted, Spent, Variance %). |
| **🗂️ Recent Transactions** | `Transactions` | `Date` ≥ `dateSubtract(now(), 14, "days")` • Sort `Date` descending | Table (show Date, Description, Amount, Category, Account, Status). |

> **Rollup tip:** On the Dashboard page add a **Formula** property `Total Unpaid Bills = sum(prop("Bills").filter(p => !p.get("Paid")).map(p => p.get("Amount")))` – Notion formulas don’t support loops, so instead create a **Rollup** on a hidden relation to `Bills` with “Sum of Amount” and filter `Paid` = unchecked.  

---  

## 📚 Databases  

### 1️⃣ Transactions  

| Property | Type | Description | Example |
|---|---|---|---|
| **Date** | Date (default today) | Transaction date. | 2024‑06‑01 |
| **Description** | Title | Free‑text description. | “Grocery Store” |
| **Category** | Relation → `Categories` (many) | Links to a category entry. | Groceries |
| **Amount** | Number (USD) | Negative = expense, Positive = income. | -185.40 |
| **Account** | Relation → `Accounts` (single) | Where the money moved. | Checking |
| **Status** | Select (Pending, Cleared, Posted) | Reconciliation state. | Cleared |
| **Notes** | Text | Optional memo. | “Used coupon #123” |
| **Running Balance** | Formula | `prop("Account").rollup("Current Balance") + prop("Amount")` (see **Accounts** rollup). | – |
| **Is Transfer?** | Checkbox | Tick if this row is a transfer between own accounts. | ☐ |

#### Suggested Views  

| View | Type | Filters / Grouping | Columns |
|---|---|---|---|
| **All Transactions** | Table | Sort `Date` descending | Date, Description, Category, Amount, Account, Status |
| **Expenses by Category** | Board | Filter `Amount` < 0 • Group by `Category` | Card: Description + Amount |
| **Income Tracker** | Table | Filter `Amount` > 0 | Date, Description, Amount, Account |
| **Pending Reconciliation** | Table | Filter `Status` = Pending | Date, Description, Amount, Account |
| **Monthly Summary** | Calendar | No filter (shows all) | Tooltip: Amount, Category |
| **Transfers** | Table | Filter `Is Transfer?` = checked | Date, Description, Amount, From → To (via two relations) |

> **Formula – Running Balance:**  
1. In **Accounts** create a rollup `Total Transactions` = sum of related `Transactions.Amount`.  
2. In **Transactions**, add a Formula `Running Balance = prop("Account").rollup("Total Transactions")`.  
3. Sort the view by `Date` ascending to see the balance evolve.  

---  

### 2️⃣ Bills  

| Property | Type | Description | Example |
|---|---|---|---|
| **Vendor** | Title | Bill issuer. | “Water Co.” |
| **Bill Type** | Relation → `Categories` (single) | Category of the bill. | Utilities |
| **Due Date** | Date | Payment deadline. | 2024‑06‑15 |
| **Amount** | Number (USD) | Amount due. | 42.10 |
| **Recurrence** | Select (One‑time, Monthly, Quarterly, Yearly) | Frequency. | Monthly |
| **Paid** | Checkbox | Tick when settled. | ☐ |
| **Account** | Relation → `Accounts` (single) | Account used for payment. | Checking |
| **Linked Transaction** | Relation → `Transactions` (single) | Auto‑created transaction after payment. | — |
| **Reminder Set** | Formula | `"🟢"` if reminder exists, else `"⚪"` (uses `dateBetween` on `Due Date`). | — |

#### Suggested Views  

| View | Type | Filters / Grouping | Columns |
|---|---|---|---|
| **All Bills** | Table | Sort `Due Date` ascending | Vendor, Bill Type, Due Date, Amount, Recurrence, Paid, Account |
| **Upcoming (7‑day)** | Calendar | Filter `Due Date` ≤ `dateAdd(now(),7,"days")` • `Paid` = unchecked | Vendor, Amount |
| **Paid History** | Table | Filter `Paid` = checked • Group by `Bill Type` | Vendor, Due Date, Amount, Account |
| **Recurring Overview** | Gallery | Filter `Recurrence` ≠ “One‑time” | Card: Vendor + Recurrence + Next Due (formula) |
| **Unpaid Summary** | Table | Filter `Paid` = unchecked • Group by `Account` | Vendor, Amount, Due Date |

> **Automation tip:** Set a Notion reminder on `Due Date` → “1 day before”. The **Reminder Set** formula will turn green when the reminder exists, giving a visual cue.  

---  

### 3️⃣ Accounts  

| Property | Type | Description | Example |
|---|---|---|---|
| **Name** | Title | Account name. | “Checking” |
| **Type** | Select (Checking, Savings, Credit Card, Cash, Investment) | Category of account. | Checking |
| **Opening Balance** | Number (USD) | Balance at start of tracking. | 2 500.00 |
| **Current Balance** | Formula | `prop("Opening Balance") + prop("Transactions").rollup("Amount", sum)` | — |
| **Currency** | Select (USD, EUR, GBP) | Currency for the account. | USD |
| **Bank URL** | URL | Link to online banking. | https://bank.example.com |
| **Active** | Checkbox | Deactivate old accounts. | ☑️ |

#### Suggested Views  

| View | Type | Filters / Grouping | Columns |
|---|---|---|---|
| **All Accounts** | Table | Sort `Name` alphabetically | Name, Type, Current Balance, Active |
| **Credit Card Summary** | Table | Filter `Type` = Credit Card | Name, Current Balance, Opening Balance |
| **Investment Snapshot** | Gallery | Filter `Type` = Investment | Card: Name + Current Balance |

---  

### 4️⃣ Budgets  

| Property | Type | Description | Example |
|---|---|---|---|
| **Category** | Relation → `Categories` (single) | Budgeted category. | Groceries |
| **Monthly Target** | Number (USD) | Planned spend (negative) or income (positive). | -400 |
| **Yearly Target** | Number (USD) | Optional annual goal. | -4 800 |
| **Spent YTD** | Rollup | Sum of related `Transactions.Amount` where `Amount` < 0 and `Date` ≤ today. | — |
| **Variance %** | Formula | `if(prop("Monthly Target") == 0, 0, (prop("Spent YTD") - prop("Monthly Target")) / abs(prop("Monthly Target")) * 100)` | — |
| **Status** | Formula | `"✅"` if variance ≤ 0 else `"⚠️"` | — |

> **Relation setup:** In **Categories** add a **Relation** property “Budget” → `Budgets` (single). In **Budgets** the reciprocal relation auto‑creates.  

#### Suggested Views  

| View | Type | Filters / Grouping | Columns |
|---|---|---|---|
| **Budget Overview** | Table | No filter | Category, Monthly Target, Spent YTD, Variance %, Status |
| **Overspend Alerts** | Table | Filter `Variance %` > 0 • Sort descending | Category, Variance %, Spent YTD, Monthly Target |
| **Annual Review** | Gallery | Group by `Yearly Target` (if set) | Card: Category + Yearly Target + YTD Spend |

---  

### 5️⃣ Categories (Read‑only)  

| Property | Type | Description |
|---|---|---|
| **Name** | Title | Category name (e.g., “Groceries”). |
| **Icon** | Emoji | Visual cue for quick scanning. |
| **Group** | Select (Income, Expense) | Helps filter budget vs. income. |
| **Default Budget** | Number (USD) | Pre‑filled target for new users (editable). |

> **Populate** this table with the following rows (you can add more later):  

| Name | Icon | Group | Default Budget |
|---|---|---|---|
| Income | 💰 | Income | 0 |
| Groceries | 🛒 | Expense | -400 |
| Dining Out | 🍽️ | Expense | -250 |
| Transportation | 🚗 | Expense | -150 |
| Utilities | 💡 | Expense | -200 |
| Subscriptions | 📺 | Expense | -100 |
| Health | 🏥 | Expense | -150 |
| Entertainment | 🎮 | Expense | -120 |
| Miscellaneous | 🧩 | Expense | -100 |
| Savings | 🏦 | Income | 0 |
| Investment | 📈 | Income | 0 |

---  

## 📈 Reports & Insights  

Create a page called **Financial Reports** (next to the Dashboard) and embed the following pre‑configured views. Use the **Notion Charts** community embed (`https://charts.notion.so/...`) – the URLs are provided for each chart; replace `YOUR_NOTION_ID` with the page’s block ID after you duplicate the template.  

| Report | Source | View | Embed Type | Description |
|---|---|---|---|---|
| **Spending Heatmap** | `Transactions` | Calendar (color by `Amount`) | Calendar (built‑in) | Darker cells = higher spend. |
| **Category Breakdown** | `Transactions` | Bar chart (group by `Category`) | Notion Charts (Bar) | Shows % of total expense per category for the selected month. |
| **Bills Paid vs. Unpaid** | `Bills` | Bar chart (Paid vs. Unpaid) | Notion Charts (Stacked Bar) | Visualises cash needed for upcoming bills. |
| **Net‑Worth Tracker** | `Accounts` | Table (rollup of `Current Balance`) | Table + Formula | Sum of all account balances = net worth. |
| **Cash‑Flow Projection** | `Transactions` + `Bills` | Line chart (Running Balance + Upcoming Bills) | Notion Charts (Line) | Forecasts balance 30 days forward. |
| **Year‑over‑Year Growth** | `Accounts` | Line chart (Net‑Worth over months) | Notion Charts (Line) | Shows wealth accumulation trend. |

> **How to embed a chart:**  
1. Copy the chart URL from the template (e.g., `https://charts.notion.so/line?data=...`).  
2. Paste it into a **“Embed”** block on the **Financial Reports** page.  
3. Adjust the block width to “Full width” for best readability.  

---  

## 📆 Monthly Review SOP  

1. **Day 1 – Upcoming Bills Check**  
   - Open **Budget Dashboard → Upcoming Bills**.  
   - Verify each `Paid` checkbox; if a bill is already settled, tick it and link the corresponding transaction (use the **“Link Transaction”** button).  

2. **Day 2‑4 – Transaction Reconciliation**  
   - Go to **Transactions → Pending Reconciliation**.  
   - Change `Status` to **Cleared** or **Posted** after confirming with your bank/credit‑card statement.  

3. **Day 5 – Budget Variance Review**  
   - Open **Financial Reports → Category Breakdown**.  
   - Compare actual spend (red bars) against your **Budgets → Budget Overview**.  
   - If any `Variance %` > 10 % → adjust the **Monthly Target** for next month or flag for expense reduction.  

4. **Day 7 – Net‑Worth Update**  
   - Ensure all recent transfers and investment updates are reflected in **Accounts**.  
   - Verify **Net‑Worth Tracker** chart matches your external statements.  

5. **End‑of‑Month – Archive**  
   - Duplicate the **Financial Reports** page → rename “Financial Report – June 2024”.  
   - Move the copy into a **Financial Archive** database (create a new database with a `Report Date` property).  
   - Export the page as PDF (⋯ → Export → PDF) and attach the file to the archive entry for quick reference.  

> **Automation shortcut:** Add a **Template Button** on the Dashboard titled “🗂️ New Monthly Review” that creates the above tasks with due dates automatically.  

---  

## ⚙️ Settings & Automation  

| Setting | Recommended Value | Why |
|---|---|---|
| **Default Currency** | USD (or your local currency) | Keeps all amount fields consistent. |
| **Budget Targets** | Set per Category in **Budgets** (e.g., Groceries $‑400) | Enables the “Budget vs. Actual” view to highlight overspend. |
| **Reminder Lead Time** | 1 day before due | Gives you enough time to fund the account. |
| **Zapier Integration** | **Zap 1:** “New Bill → Create Transaction” (maps Vendor → Description, Amount, Account, Due Date) <br>**Zap 2:** “New Transaction → Google Sheet backup” | Automates bill‑to‑transaction logging and creates an external audit trail. |
| **Notion API Token** | Store in a secure vault (e.g., 1Password) | Required for any custom scripts or third‑party syncs. |
| **Weekly Sync** | Every Sunday 22:00 → Run Python script (see below) | Pulls monthly totals into a personal finance dashboard (optional). |

### Automation Checklist  

- [ ] **Enable Reminders** on `Bills.Due Date` (set “1 day before”).  
- [ ] **Zapier – New Bill → Transaction**: <br>• Trigger: New row in `Bills` where `Paid` = unchecked. <br>• Action: Create row in `Transactions` with `Amount` = `-Bills.Amount`, `Description` = `Bills.Vendor`, `Account` = `Bills.Account`, `Date` = `Bills.Due Date`. <br>• After Zap runs, manually tick `Paid` and link the created transaction.  
- [ ] **Zapier – New Transaction → Google Sheet**: <br>• Trigger: New row in `Transactions`. <br>• Action: Append row to a Google Sheet named “Finance Backup”.  
- [ ] **Python API Script (optional)** – Save as `monthly_report.py` in your local repo:  

```python
import os, requests, datetime, json

NOTION_TOKEN = os.getenv("NOTION_TOKEN")
DATABASE_ID = "YOUR_TRANSACTIONS_DB_ID"

def query_month(month: int, year: int):
    url = f"https://api.notion.com/v1/databases/{DATABASE_ID}/query"
    headers = {
        "Authorization": f"Bearer {NOTION_TOKEN}",
        "Notion-Version": "2022-06-28",
        "Content-Type": "application/json",
    }
    payload = {
        "filter": {
            "and": [
                {"property": "Date", "date": {"on_or_after": f"{year}-{month:02d}-01"}},
                {"property": "Date", "date": {"before": f"{year}-{month:02d}-01", "on_or_before": f"{year}-{month:02d}-31"}}
            ]
        }
    }
    resp = requests.post(url, headers=headers, json=payload)
    data = resp.json()
    total = sum(float(row["properties"]["Amount"]["number"]) for row in data["results"])
    print(f"Total for {year}-{month:02d}: ${total:,.2f}")

if __name__ == "__main__":
    today = datetime.date.today()
    query_month(today.month, today.year)
```

> **Run it** with `python monthly_report.py` after setting `NOTION_TOKEN` and replacing `YOUR_TRANSACTIONS_DB_ID`.  

---  

## 📥 How to Import This Template into Notion  

1. **Create a new page** in your workspace where you want the system.  
2. Click the three‑dot menu → **“Import”** → choose **“Markdown & CSV”**.  
3. Upload this `.md` file. Notion will render headings, tables, and callout blocks automatically.  
4. For each table named **Transactions**, **Bills**, **Accounts**, **Budgets**, **Categories**, click the **“Convert to Database”** button that appears at the top‑right of the table.  
5. Rename each database exactly as shown (e.g., “Transactions”).  
6. **Set up relations:**  
   - In **Bills**, add a **Relation** → link to **Transactions**, name it **Linked Transaction**.  
   - In **Transactions**, the reciprocal relation appears automatically (you may rename it “Bill”).  
   - In **Transactions**, add a **Relation** → **Accounts** (single) and another → **Categories** (single).  
   - In **Budgets**, add a **Relation** → **Categories** (single) and vice‑versa.  
   - In **Categories**, add a **Relation** → **Budgets** (single) for quick navigation.  
7. **Create the Dashboard & Reports pages** (copy the view definitions from the tables above). Use **“Create linked database”** blocks and apply the filters/sorts exactly as listed.  
8. **Enable reminders** on the `Bills.Due Date` property (click the date → “Add reminder” → “1 day before”).  
9. (Optional) **Connect Zapier** or run the Python script as described in the Settings section.  

Your **Budget & Bill Tracker** is now live. Start entering real transactions and bills, and let the system keep your finances transparent, on‑track, and ready for any audit. 🎉