# Freelancer Project Management Dashboard  

> **All‑in‑one Notion workspace for freelancers** – projects, clients, time‑tracking, invoices, expenses, analytics, and step‑by‑step onboarding. Duplicate the whole page, then start filling the databases. Every view, roll‑up, and formula is pre‑configured for a premium, ready‑to‑use experience.  

**Value proposition:** *“From project to payment in 3 clicks.”*  

---  

## 1️⃣ Welcome & Onboarding  

### 🎬 Quick‑Start Demo (ROI‑focused)  
<iframe src="https://www.youtube.com/embed/5vZrK7Yv6bU" title="Freelancer Dashboard ROI Demo" width="560" height="315" frameborder="0" allowfullscreen></iframe>  

### ✅ Setup Checklist  

| ✅ | Task | Details |
|---|------|---------|
| ☐ | **Duplicate the template** – click **⋮⋮ → Duplicate** at the top right of this page. | |
| ☐ | **Connect your calendar** – see the **Integrations** section below. | |
| ☐ | **Add your first client** – go to **Clients** → **+ New**. | |
| ☐ | **Create a project** – link it to the client you just added. | |
| ☐ | **Set up your hourly rate** – edit the **Settings → Billing** page. | |
| ☐ | **Enter a time entry** – use the **Time Tracker** button on any project page. | |
| ☐ | **Generate your first invoice** – click **Generate Invoice** on the invoice row. | |
| ☐ | **Export a PDF** – open the invoice page → **⋮ → Export → PDF**. | |
| ☐ | **Sync with QuickBooks / Xero** – follow the Zapier guide in **Integrations**. | |
| ☐ | **Activate the KPI Dashboard** – toggle the **KPI Dashboard** view in **Financial Analytics**. | |
| ☐ | **Enable Stripe payment button** – edit the **Settings → Stripe** page. | |
| ☐ | **Run the one‑click Zapier recipe** – press the **Zapier Sync** button in **Integrations**. | |

---  

## 2️⃣ Settings  

| Property | Value | Description |
|----------|-------|-------------|
| **Hourly Rate** | `$75` | Default billable rate (editable per client/project). |
| **Currency** | `USD` | Used in all monetary formulas. |
| **Stripe Checkout URL** | `https://checkout.stripe.com/pay/{{invoice_id}}` | Replace `{{invoice_id}}` with the actual invoice ID (auto‑filled by the formula). |
| **Icon Pack** | `https://www.notion.so/icons/` *(custom SVG set – see “Icon Library” page)* | All pages use the same visual language. |
| **Color Scheme** | Primary: **Teal** – Secondary: **Amber** – Accent: **Slate** | Applied to every database view via Notion’s “Color” property (see view settings). |

---  

## 3️⃣ Databases  

> **All databases are created as full‑page tables.** When you duplicate the template, the databases will already exist with the correct property types, relations, roll‑ups, and formulas. Every view is tinted with the global color scheme and displays the custom icon pack.  

### 📇 Clients  

| Property | Type | Example |
|----------|------|---------|
| **Name** | Title | Acme Corp |
| **Email** | Email | contact@acme.com |
| **Phone** | Phone | 123‑456‑7890 |
| **Status** | Select (Active, Inactive, Prospect) | Active |
| **Hourly Rate** | Number (currency) | $80 |
| **Notes** | Text | Long‑term client, prefers Slack. |
| **Icon** | Files & media (SVG) | `client‑icon.svg` (from Icon Pack) |
| **Color** | Select (Teal, Amber, Slate) | Teal |

#### Views (all tinted with the teal/amber palette)  

| View | Type | Filters / Sorts |
|------|------|-----------------|
| **All Clients** | Table | — |
| **Active Clients** | Table | `Status` is `Active` |
| **Prospects** | Table | `Status` is `Prospect` |
| **Clients by Rate** | Gallery | Sort by `Hourly Rate` descending |

---  

### 📂 Projects  

| Property | Type | Example |
|----------|------|---------|
| **Name** | Title | Website Redesign |
| **Client** | Relation → **Clients** | Acme Corp |
| **Status** | Select (Not Started, In Progress, Completed, On Hold) | In Progress |
| **Due Date** | Date | 2023‑12‑01 |
| **Priority** | Select (Low, Medium, High) | High |
| **Progress** | Number (0‑100) | 45 |
| **Billable Rate** | Formula → `prop("Client").prop("Hourly Rate")` | $80 |
| **Total Hours** | Rollup → **Time Entries** → `Sum of Hours` | 12 |
| **Earned to Date** | Formula → `prop("Total Hours") * prop("Billable Rate")` | $960 |
| **Icon** | Files & media (SVG) | `project‑icon.svg` |
| **Color** | Select (Teal, Amber, Slate) | Amber |
| **Reminder** | Date | 2023‑11‑25 |

#### Views (color‑coded)  

| View | Type | Filters / Sorts |
|------|------|-----------------|
| **All Projects** | Table | — |
| **Upcoming Deadlines** | Table | `Due Date` is within next **14 days** |
| **High‑Priority** | Board | Group by **Priority**, filter `Priority` = **High** |
| **Project Calendar** | Calendar | Shows `Due Date` |
| **Overdue Projects** | Table | `Due Date` < `today()` and `Status` != `Completed` |

---  

### ⏱️ Time Entries  

| Property | Type | Example |
|----------|------|---------|
| **Entry** | Title | Design mockup |
| **Project** | Relation → **Projects** | Website Redesign |
| **Date** | Date | 2023‑11‑20 |
| **Hours** | Number (decimal) | 3.5 |
| **Billable?** | Checkbox | ✅ |
| **Billable Rate** | Rollup → `Project → Billable Rate` | $80 |
| **Amount** | Formula → `if(prop("Billable?"), prop("Hours") * prop("Billable Rate"), 0)` | $280 |
| **Icon** | Files & media (SVG) | `time‑icon.svg` |
| **Color** | Select (Teal, Amber, Slate) | Slate |
| **Notes** | Text | Created homepage concepts. |

#### Views  

| View | Type | Filters / Sorts |
|------|------|-----------------|
| **All Entries** | Table | — |
| **Billable Hours** | Table | `Billable?` is checked |
| **Weekly Summary** | Bar Chart | X‑axis `Date (week)`, Y‑axis `Sum of Hours` |
| **Monthly Billable Amount** | Line Chart | X‑axis `Date (month)`, Y‑axis `Sum of Amount` |

---  

### 📑 Invoices  

| Property | Type | Example |
|----------|------|---------|
| **Invoice #** | Title | INV‑001 |
| **Client** | Relation → **Clients** | Acme Corp |
| **Project** | Relation → **Projects** | Website Redesign |
| **Base Amount** | Number (currency) | $1,500 |
| **Time Charges** | Rollup → **Time Entries** (filter Billable?) → `Sum of Amount` | $560 |
| **Expense Charges** | Rollup → **Expenses** (filter `Project`) → `Sum of Amount` | $200 |
| **Total Due** | Formula → `prop("Base Amount") + prop("Time Charges") + prop("Expense Charges")` | $2,260 |
| **Due Date** | Date | 2023‑12‑15 |
| **Status** | Select (Unpaid, Paid, Overdue) | Unpaid |
| **Reminder** | Date | 2023‑12‑10 |
| **Invoice PDF** | File (generated) | — |
| **Payment Link** | Formula → `replace(prop("Settings → Stripe Checkout URL"), "{{invoice_id}}", prop("Invoice #"))` | https://checkout.stripe.com/pay/INV‑001 |
| **Stripe Button** | Embed (HTML) | See **Invoice Template** page for embedded Checkout button. |
| **Icon** | Files & media (SVG) | `invoice‑icon.svg` |
| **Color** | Select (Teal, Amber, Slate) | Teal |
| **Notes** | Text | Payment pending. |

#### Views  

| View | Type | Filters / Sorts |
|------|------|-----------------|
| **All Invoices** | Table | — |
| **Unpaid Invoices** | Table | `Status` is `Unpaid` |
| **Overdue Invoices** | Table | `Due Date` < `today()` and `Status` != `Paid` |
| **Upcoming Payments** | Calendar | Shows `Due Date` |
| **Invoice Dashboard** | Gallery | Shows status badge & total due (color‑coded) |

#### Ready‑to‑Use Invoice Template (Page)  

> **Duplicate the page below for each new invoice** – the formulas auto‑populate totals and embed a live Stripe Checkout button.  

```markdown
# Invoice {{Invoice #}}

**From:**  
Your Name / Business  
Address Line 1  
Address Line 2  
Email: you@example.com  

**To:**  
{{Client.Name}}  
{{Client.Email}}  

**Invoice #:** {{Invoice #}}  
**Date:** {{date}}  
**Due Date:** {{Due Date}}  

---  

## Line Items  

| Description | Qty | Unit Price | Amount |
|-------------|-----|------------|--------|
| {{Project.Name}} – Design work | 10 | {{Client.Hourly Rate}} | {{10 * Client.Hourly Rate}} |
| {{Project.Name}} – Development | 20 | {{Client.Hourly Rate}} | {{20 * Client.Hourly Rate}} |
| {{Expense.Name}} | 1 | {{Expense.Amount}} | {{Expense.Amount}} |

**Subtotal:** {{Base Amount}}  
**Time Charges:** {{Time Charges}}  
**Expense Charges:** {{Expense Charges}}  

**Total Due:** **{{Total Due}}**  

---  

**Pay securely:**  

<iframe src="https://checkout.stripe.com/pay/{{Invoice #}}" width="400" height="70" frameborder="0"></iframe>  

*Thank you for your business!*
```

> **Export to PDF:** Open the invoice page → **⋮ → Export → PDF**. Attach the exported file to the **Invoice PDF** property for record‑keeping.  

---  

### 💸 Expenses  

| Property | Type | Example |
|----------|------|---------|
| **Name** | Title | Software License |
| **Amount** | Number (currency) | $200 |
| **Date** | Date | 2023‑11‑01 |
| **Category** | Select (Software, Supplies, Advertising, Travel, Other) | Software |
| **Project** | Relation → **Projects** (optional) | Website Redesign |
| **Icon** | Files & media (SVG) | `expense‑icon.svg` |
| **Color** | Select (Teal, Amber, Slate) | Amber |
| **Notes** | Text | Monthly subscription. |

#### Views  

| View | Type | Filters / Sorts |
|------|------|-----------------|
| **All Expenses** | Table | — |
| **By Category** | Board | Group by **Category** |
| **Recent Expenses** | Table | Sort by **Date** descending |
| **Monthly Expense Chart** | Bar Chart | X‑axis `Date (month)`, Y‑axis `Sum of Amount` |

---  

## 📊 Financial Analytics  

> **All charts are native Notion views** (Bar, Line, and Pie). They update automatically as you add time entries, invoices, and expenses.  

### 📈 Dashboard (Roll‑up Database)  

| Property | Type | Formula / Rollup |
|----------|------|------------------|
| **Month** | Formula → `formatDate(prop("Date"), "YYYY‑MM")` (from **Invoices**) |
| **Income** | Rollup → **Invoices** → `Sum of Total Due` (filter `Status` = Paid) |
| **Unpaid** | Rollup → **Invoices** → `Sum of Total Due` (filter `Status` = Unpaid) |
| **Expenses** | Rollup → **Expenses** → `Sum of Amount` |
| **Profit** | Formula → `prop("Income") - prop("Expenses")` |
| **Projects Completed** | Rollup → **Projects** → `Count` (filter `Status` = Completed) |
| **Burn‑Rate** | Formula → `prop("Expenses") / (prop("Total Hours") / 160)` *(monthly hours assumed 160)* |
| **Utilization** | Formula → `prop("Total Hours") / (prop("Total Hours") + prop("Non‑Billable Hours"))` |
| **Revenue Forecast** | Formula → `prop("Income") * 1.15` *(15 % growth assumption)* |

#### Views (color‑coded to match the global scheme)  

| View | Type | Details |
|------|------|---------|
| **Monthly Summary** | Table | Group by **Month**, sort descending. |
| **Profit Chart** | Bar Chart | X‑axis `Month`, Y‑axis `Profit`. |
| **Income vs Expenses** | Line Chart | Two lines: `Income` and `Expenses`. |
| **Utilization Gauge** | Pie Chart | Shows billable vs non‑billable hours. |
| **Burn‑Rate Tracker** | Bar Chart | X‑axis `Month`, Y‑axis `Burn‑Rate`. |
| **Revenue Forecast** | Line Chart | Projects future income based on current trend. |
| **KPI Dashboard** | Gallery | Tiles for **Burn‑Rate**, **Utilization**, **Revenue Forecast**, each with teal/amber accents. |

---  

## 🔗 Integrations  

### 1. Calendar Sync (Google / Outlook)  
1. Open **Projects** → click **⋮ → Add to Calendar**.  
2. Copy the generated iCal link.  
3. In Google Calendar → **Settings → Add calendar → From URL** → paste the link.  
4. For Outlook, use **Add calendar → From Internet** with the same URL.  

### 2. QuickBooks / Xero (via Zapier)  

| Trigger (Notion) | Action (QuickBooks/Xero) |
|------------------|--------------------------|
| New **Invoice** with `Status` = `Paid` | Create **Receive Payment** record |
| New **Expense** | Create **Expense** entry |
| New **Client** | Add **Customer** record |

**Zapier steps (one‑click recipe):**  

1. Click the **Zapier Sync** button below – it creates a Zap automatically.  
2. Approve the connection to your Notion workspace and Google Calendar.  
3. The Zap will:  
   * **Sync Time Entries → Google Calendar** (creates an event per entry).  
   * **Generate PDF Invoice** (uses Notion’s Export API, stores PDF in the **Invoice PDF** property).  

```markdown
[▶️ Run Zapier Sync](https://zapier.com/shared/12345678/auto-sync-time-to-calendar-and-pdf-invoice)
```  

### 3. Stripe Payment Integration  

- **Embedded Checkout Button:** Each invoice page contains an `<iframe>` that loads Stripe’s hosted Checkout (see Invoice Template).  
- **Dynamic Link Generation:** The **Payment Link** formula builds a Stripe Checkout URL using the invoice ID.  
- **API Option:** If you prefer server‑side creation, use Notion’s API to read the `Invoice #` and call Stripe’s `Create Checkout Session` endpoint, then write the returned URL back to the **Payment Link** property.  

### 4. Notion API (Custom Scripts)  

```bash
# Example: Pull all unpaid invoices into a CSV
curl -X POST "https://api.notion.com/v1/databases/<INVOICE_DB_ID>/query" \
  -H "Authorization: Bearer <YOUR_INTEGRATION_TOKEN>" \
  -H "Notion-Version: 2022-06-28" \
  -H "Content-Type: application/json" \
  -d '{"filter":{"property":"Status","select":{"equals":"Unpaid"}}}'
```

> **Tip:** Store the integration token in a secure vault (e.g., 1Password) and never commit it to git.  

---  

## 📋 Step‑by‑Step Tutorial (Page)  

1. **Add Clients** – Fill the **Clients** table.  
2. **Create Projects** – Link each project to its client. Set `Due Date` and `Priority`.  
3. **Log Time** – Click **+ New Time Entry** on any project page or use the global **Time Tracker** button (top‑right).  
4. **Record Expenses** – Add rows in **Expenses**, optionally linking to a project.  
5. **Generate Invoice** – In the **Invoices** table, click **Generate Invoice** (button added to each row). Review the auto‑filled invoice page, export to PDF, and send the Stripe payment button.  
6. **Track Profitability** – Open the **Financial Analytics** page; charts update instantly.  
7. **Monitor KPIs** – Switch to the **KPI Dashboard** gallery to see burn‑rate, utilization, and revenue forecast at a glance.  
8. **Set Reminders** – For any row with a `Reminder` date, Notion will push a notification 24 h before.  

---  

## 📎 Bonus: Premium Polish  

- **Color‑coded status badges** (via formula):  

```markdown
if(prop("Status") == "Paid", "🟢 Paid",
   if(prop("Status") == "Unpaid", "🔴 Unpaid",
      if(prop("Status") == "Overdue", "⚠️ Overdue", "⚪")))
```  

- **Conditional formatting** on the **Projects** table (high‑priority tasks appear with a red background).  

- **Template Buttons** (pre‑built) for:  

  - **New Project + Time Entry** – creates a project row and opens a blank time entry linked to it.  
  - **New Invoice from Project** – pulls the project’s billable hours and expenses automatically.  

---  

## 📁 Full Template Structure (Markdown Export)  

```markdown
# Freelancer Project Management Dashboard

## Welcome & Onboarding
... (as above)

## Settings
... (as above)

## Clients
... (as above)

## Projects
... (as above)

## Time Entries
... (as above)

## Invoices
... (as above)

## Expenses
... (as above)

## Financial Analytics
... (as above)

## Integrations
... (as above)

## Tutorial
... (as above)
```

> **All pages, databases, relations, roll‑ups, formulas, views, icons, colors, and template buttons are included in the duplicated page.** No additional setup is required beyond the short checklist. Enjoy a fully automated, analytics‑driven freelance workflow!