A client asks on a call: "What's the status of the homepage redesign? And can you resend last month's invoice? And where's the staging server login?"
You open Notion for the client. Trello for the project. Excel for the invoice log. 1Password for the server. Four tabs, 4 searches, 2 wrong results. You say "I'll send it after the call" — and spend 25 minutes reconstructing what should have been one view.
Freelance chaos is not too many clients. It's unlinked clients, projects, and money.
Why Separate Tools Fail the Freelancer
Your current stack:
- Notion for client notes — no
budget,advance,deadlinesrc/lib/db/schema.ts:23 - Trello for tasks — no
clientIdFK, noprojectIdsrc/lib/db/schema.ts:45 - Invoice tool for billing — no
projectIdsrc/app/api/invoices/route.ts:60, noportalTokenssrc/lib/db/schema-public.ts:169 - Vault generic — no
clientIdsrc/lib/db/schema.ts:125, flat list of 200 entries
Result: a project called Acme Homepage in Trello, a client Acme Corp in Notion, an invoice INV-12 in QuickBooks — three names for the same work, no FK. Change the budget in one, the other lies.
The cost: A retainer advance ₹50k logged in Excel but not in project advance src/lib/db/schema.ts:32 — you under-invoice. A deadline in Trello not visible from client record — you miss the follow-up, client churns. A vault entry acme-server not linked — you send wrong IP, downtime.
A system without links is a set of lists. A system with links is an OS.
The Linked Graph: One Client → Everything
In RunoSO's tenant_${id} src/lib/db/tenant.ts:47, every entity is a FK:
clients 1—∞ projects 1—∞ tasks
1—∞ invoices (clientId) + (projectId)
1—∞ vaultItems (clientId, projectId)
1—∞ assets_domains/hosting/socialCreate once, linked everywhere src/app/api/projects/route.ts:145:
- Pick
clientIdfromclients— no re-typingAcme Corp - Set
type:dev|content|designstatus:planning|active|in-review|completedsrc/lib/db/schema.ts:10,budget numeric(12,2)deadline,githubUrl - If
advance > 0, auto-inserttransactions type:income category:Project Advancesrc/app/api/projects/route.ts:145→projects.advancesynced viasyncProjectAdvancesrc/app/api/transactions/route.ts:21 - Tasks
POST /api/projects/[id]/taskscascadetask.projectId— no orphan tasks
Open Clients → Acme src/app/(dashboard)/clients/[id]/page.tsx ClientDetailPageClient — you see projects with totalTasks/doneTasks src/app/api/projects/route.ts:28, invoices paid|sent|overdue, vault credentials masked src/app/api/vault/route.ts:25, assets domains expiring.
One record, full context. No tab hunt.
Workflow That Keeps Deadlines & Payments Tight
Daily: Tasks → Today GET /api/tasks?view=today src/app/api/tasks/route.ts:98 runs runDailyRollover src/lib/utils/task-rollover.ts:1 — unfinished scheduledDate < today rolls to today with rolledOverFrom. Your TodayFocusCard on dashboard shows remainingTasks from GET /api/sidebar/stats src/app/api/sidebar/stats/route.ts:55. No manual carry-over.
Weekly: Filter clients by status:lead|active|paused src/lib/db/schema.ts:7 in your 10-min review. Paused >60 days → ping. Active with project deadline <7d → prioritize. Invoices overdue from cron daily src/app/api/cron/daily/route.ts:275 dueDate<now → sent→overdue + notifications → digest email.
Client asks status: Send portalTokens link POST /api/clients/[id]/portal/route.ts:169 → portal/[id] shows project progress + invoices without login — revoke revokedAt anytime. No email thread.
Mistakes That Break the Link
1. Treating clients as names, not IDs. Typing Acme in three tools creates three strings, not one uuid gen_random_uuid() src/lib/db/schema.ts:7. Use clientId FK, enforce cascade.
2. Tracking tasks outside projects. A personalTasks isToday src/lib/db/schema.ts:239 is fine for Buy groceries, not for Homepage hero. Link client work to tasks.projectId — otherwise you'll ship hero but forget invoice.
3. Budget in head, not in numeric. budget 120000 advance 30000 as numeric(12,2) src/lib/db/schema.ts:32 drives FinanceOverviewClient Recharts live. A Notion text "$10k~" doesn't sum.
15-Minute Linked Setup
- Create 1 client
POST /api/clients— setstatus:active,company,notes: prefers Slack, NET-15. - Create 1 project linked → set
budget+GitHub— watchFinanceadvance transaction appear. - Add 3 tasks linked →
priority:high→ checkDashboardTodayFocusCardcount rises. - Create 1 invoice
POST /api/invoices/route.ts:84linkedclientId+projectId—taxTypeauto,invoiceNumberFY sequentialGOS/25-26/001. - Link 1 vault item
category:serverwithclientId— open client, see credential one-click.
You just replaced Notion + Trello + Excel + 1Password with one graph tenant_${id}. That's why it scales to Solo ∞ src/lib/plans/limits.ts:28.
RunoSO links your freelance operating graph — clients, projects, tasks, invoices, vault, assets, content — in one dashboard. Stop linking in your head. Let FKs do it.
→ Try RunoSO Free — 3 Clients, 5 Projects Live
By Gautam Parmar — src/app/(marketing)/about/page.tsx:44 solo founder, Next.js 16 Tailwind v4 Neon Drizzle AES-256-GCM, building in public on X.
Keep Reading
- Ops hub: freelance operations hub single dashboard.
- Never lose credentials: where never store passwords.
- Asset linkage: spreadsheet chaos to control.



