You sent the proposal on Tuesday. Acme Growth Revamp — ₹1.2L, 5 pages, 2 revisions, 4 weeks, hosting excluded. Client replied Thursday: Approved. Let's start Monday. Send invoice for advance.
Monday 10 AM kickoff hits. You open Google Docs for the proposal, Notion for the Acme Corp page you created last month, Trello for the Acme Homepage card template, and Sheets for the budget log. You re-type: project Acme Growth Revamp into Trello, budget 120000 into Sheets, 8 tasks from the proposal's Scope section into Trello checklists, and advance 30000 into your invoice tool. By task 5 you paraphrase: Homepage hero + CMS becomes Homepage build. Revision cap disappears. Hosting excluded is not copied.
Week 3, client: Where's hosting setup? You said included. You didn't. But the new Trello card says Homepage build — ambiguous. You eat 6 hours free because you can't prove what was promised. The proposal was right. The handover invented a new scope.
Freelance handover failure is not carelessness. It's copy-paste as system.
Why Proposal → Project Breaks in Notion / Excel / HubSpot
Your current handover is string-based, not ID-based:
- Notion holds the proposal narrative — beautiful doc, no
budget numeric(12,2)src/lib/db/schema.ts:35, nodeadline timestampsrc/lib/db/schema.ts:33, nogithubUrlsrc/lib/db/schema.ts:34. You re-type numbers, introducing typos. Text₹1.2L approxcan't be summed inFinanceOverviewClientsrc/components/finance/FinanceOverviewClient.tsx. - Excel / Sheets holds
budgetandadvanceas cells with noclientIdFKsrc/lib/db/schema.ts:25. RenameAcme CorptoAcme Pvt Ltdin Notion, Sheets still saysAcme Corp. No cascadeonDelete:cascadesrc/lib/db/schema.ts:26, no truth. - HubSpot (or HoneyBook) holds the deal as
Deal Amountbut pushes to project via Zap —Acme Homepagein Trello is a new string, notprojectId uuidsrc/lib/db/schema.ts:24. Taskssrc/lib/db/schema.ts:45orphan:projectId notNullsrc/lib/db/schema.ts:47unenforced because Trello has no FK. - Trello holds tasks as cards with no
priority low|medium|highsrc/lib/db/schema.ts:43tied toproject.budgetburn. Client approved2 revisionslives in Doc, not inproject.notessrc/lib/db/schema.ts:32.
Result: you re-type 4 times, lose fidelity once, pay with free work. HubSpot → Zap → Trello is four hops for what should be one FK pick. Notion can't enforce clientId notNull; Sheets can't auto-create transactions type:income category:Project Advance src/app/api/projects/route.ts:145. Scope lives in prose, not in linked records.
A proposal is a promise. A handover that re-types the promise is a game of telephone you lose.
The Linked Handover: One Client → One Project → Many Tasks (Typed)
In RunoSO, every tenant is tenant_${id} src/lib/db/tenant.ts:47 — 26 tables where clients 1—∞ projects 1—∞ tasks and clients 1—∞ invoices/vaultItems are FK-enforced:
clients(id uuid pk, status lead|active|inactive src/lib/db/schema.ts:5)
1—∞ projects(clientId uuid fk notNull onDelete:cascade src/lib/db/schema.ts:25, budget numeric, advance numeric, deadline, githubUrl, type dev|content|design|other)
1—∞ tasks(projectId uuid fk notNull src/lib/db/schema.ts:47, status todo|in-progress|done, priority)
1—∞ invoices(clientId+projectId)
1—∞ vaultItems(clientId+projectId) AES-256-GCMHandover in 6 minutes, zero re-typing:
- Find or confirm
clientId.POST /api/clientsalready holdsAcme Corpstatus:lead → activesrc/lib/db/schema.ts:13. No newAcmestring. HubSpot deal would still make you searchAcmevsACME. - Create
projectlinked.POST /api/projectssrc/app/api/projects/route.ts:145— pickclientIddropdown, settitle,type:design,status:active,budget:120000,advance:30000,deadline,description= paste finalScope + Exclusionsonce intodescription/notessrc/lib/db/schema.ts:32. Typednumeric(12,2)drivesRechartslive; text1.2Lnever does. - Auto-finance sync. If
advance > 0, RunoSO insertstransactions type:income category:Project Advancesrc/app/api/projects/route.ts:145and futuresyncProjectAdvancesrc/app/api/transactions/route.ts:21keepsprojects.advancehonest. Sheets needsSUMIFyou forget. - Break proposal bullets into
tasks.POST /api/projects/[id]/taskstask.projectIdenforced — no orphanHomepage herofloating in Trello backlog. Setpriority:highforWeek 1 hero,dueDatefor milestone. - Link vault + assets upfront. Attach
vaultItems clientId/projectIdsrc/lib/db/schema.ts:133Figma link,hosting vaultItemIdsrc/lib/db/schema.ts:198, so kickoff doesn't chase logins mid-sprint. - Invite via portal.
POST /api/clients/[id]/portalportalTokens tenantId+clientId unique revokedAtsrc/lib/db/schema-public.ts:169→portal/[token]shows client scope + progress. Decisions log against dossier, not WhatsApp.
One clientId pick eliminates 4 re-types. Scope now lives in projects record, not in Doc prose you must hunt.
Handover System: The 8-Item Scope Lock
Before you click Create project, run this lock — paste into project.description so both sides see it:
- Included: numbered deliverables exactly as proposed (e.g.,
5 pages: Home, About, Services, Contact, Blog index) - Excluded: explicit list (
Hosting setup, Logo design, App screens→ prevents hosting confusion) - Revisions:
2 rounds, 3rd at ₹X— ties totaskscount - Timeline &
deadline:src/lib/db/schema.ts:334 weeks, milestone dates— visible onClientDetailPageClientsrc/app/(dashboard)/clients/[id]/page.tsx - Budget &
advance:budget 120000advance 30000numericsrc/lib/db/schema.ts:35+invoice draftamount numericsrc/lib/db/schema.ts:69 - Access needed: list
CMS, hosting, Figma, GitHubgithubUrlsrc/lib/db/schema.ts:34 - Communication:
Slack thread + weekly portal update Friday 4 PM— not 3 apps - Approval: one line: Client initials scope + budget before tasks start
Without this lock, Homepage build means anything. With it, Trello card Homepage build is banned — task must be Home — hero + CMS (rev 1/2) linked to project.
Mistakes That Re-Create the Gap
Mistake 1: Treating proposal as doc, not data.
If budget stays as ₹1.2L approx in Google Doc, you can't filter activeProjects where budget > 100000 src/app/api/sidebar/stats/route.ts:55. Type it numeric(12,2) once, query forever.
Mistake 2: Creating project before confirming clientId.
Typing Acme Revamp without picking Acme Corp (lead) creates string future-you must reconcile. Pick clientId, then create — clientId notNull src/lib/db/schema.ts:25 enforces, Sheets never does.
Mistake 3: Tasks outside project.
A personalTasks isToday src/lib/db/schema.ts:247 for Buy groceries is fine, but Homepage hero as personalTasks breaks project.totalTasks/doneTasks src/app/api/projects/route.ts:28 progress and portal visibility. Link client work to tasks.projectId.
Notion + Sheets + HubSpot + Trello vs Linked RunoSO
| Handover moment | Notion + Sheets + HubSpot → Trello | RunoSO tenant_${id} 26 tables | |||
|---|---|---|---|---|---|
Budget/advance capture | Re-type 1.2L text → Sheet cell → typo, no sum | projects budget/advance numeric(12,2) + transactions auto + live FinanceOverviewClient | |||
| Scope fidelity | Copy-paste 8 bullets → paraphrase drift | project.description/notes single scope lock → tasks 1:1 linked projectId FK | |||
| Client identity | Acme in 4 tools, 3 strings | clientId uuid onDelete:cascade one record, all FKs follow | |||
| Progress truth | Trello Done vs Sheet Invoiced manual | projects totalTasks/doneTasks + `invoices status draft | sent | paid | overdue` one dossier |
| Client visibility | Email updated scope PDF v3 | portalTokens portal/[id] shows live `status active | completed src/lib/db/schema.ts:21` self-serve | ||
| Vault at kickoff | DM server IP later | vaultItems clientId/projectId AES-256-GCM src/lib/vault/crypto.ts:22 linked from day 1 |
Telephone vs FK. One drifts, one doesn't.
10-Minute Handover Checklist
- Open
Clients→ confirmAcme Corp status:active→Max 30? No duplicate string. Create Project→ pickclientId→ pasteScope Lock 8 items→ setbudget/advance/deadline/type/status.- Verify
Financeauto-transactionProject Advanceappeared — no manual Sheet entry. Add 5-8 tasksfrom scope bullets — eachpriority+dueDate→ checkDashboard TodayFocusCardcount.Create Invoice draftPOST /api/invoicesclientId+projectIdamountinvoiceNumber GOS/25-26/001sequential — advance invoice ready before kickoff call ends.Generate portalPOST /api/clients/[id]/portal→ pasteportal/[token]in kickoff agenda — scope visible,revokedAtif needed.
Do this before Let's start Monday. Scope stays the promise you sold.
RunoSO turns proposals into linked projects — client → project → tasks → invoices → vault in one tenant_${id} graph. Stop re-typing scope, start delivering it.
→ Start Your Linked Handover — Try RunoSO Free
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
- Linked system deep dive: client & project linked system.
- Ops hub for kickoff: freelance operations hub single dashboard.
- Never lose credentials at handover: where freelancers should never store passwords.
FAQ
How do I stop scope drift after handover? Keep scope in projects.description/notes as numbered Included/Excluded plus revision cap. Link every tasks.projectId src/lib/db/schema.ts:47 to that project — extras become new tasks only via change-order flow that bumps budget and spawns invoices.
Can I import existing proposals? Yes — paste final scope into project.description, set budget/advance numeric src/lib/db/schema.ts:35, split bullets into tasks. Future transactions sync src/app/api/transactions/route.ts:21 keeps finance true without Sheet.
Why not just use Notion + Sheets? Notion holds prose 1.2L approx not numeric, Sheets holds strings not clientId uuid FK src/lib/db/schema.ts:25. You re-type, drift, and lose totalTasks/doneTasks truth. tenant_${id} FK graph keeps one scope, queryable.



