Project done. Acme Growth Revamp ships, invoice GOS/25-26/014 ₹1.35L paid, tasks 14/14 done src/app/api/projects/route.ts:28. You send Done, thanks! on WhatsApp, share Drive Final assets, forward hosting IP you DM'd 4 weeks ago now guessing which of 3 acme-server in flat 1Password, and move Notion Acme → Completed. Two weeks later client: Where's repo? Domain expires when? Can you send invoice again? You hunt Drive + GoDaddy + Sheet expiry — 35 minutes. They don't refer. Not because work bad, because ending messy.
Offboarding is not thanks + files. It's the last memory that triggers referral.
Why Go-Live Then Ghost Fails (Notion / Sheets / HubSpot + Drive)
Your current close:
- Drive / Notion —
Finalfolder withv4_final_really+ handover doc linkanyone-with-linkthat breaks in 30 days. NoportalTokens tenantId+clientId unique revokedAtsrc/lib/db/schema-public.ts:169stable share, noprojects status:completedsrc/lib/db/schema.ts:21visibility, noexpiryDatesrc/lib/db/schema.ts:153truth beside asset. - Sheets —
Assetstab withacme.com GoDaddy expiry 2027-03-12you typed manually;hosting renewalDatesrc/lib/db/schema.ts:197in head, notassetsHosting vaultItemIdsrc/lib/db/schema.ts:198link. Client asksautoRenew?you re-open GoDaddy — 12-minute hunt × 6 clients = 1 hour weekly. - Vault flat — 1Password
acme-server,acme-server prod,acme GitHub oldflat list 200 entriessrc/lib/db/schema.ts:125noclientId/projectIdsrc/lib/db/schema.ts:133. You DMapi keyin Slack, they DM again next month — leak loop. NoAES-256-GCMper-workspacesrc/lib/vault/crypto.ts:22+masked ••••src/app/api/vault/route.ts:25one dossier. - HubSpot —
Deal Closed Wonmoves toCompletedbut vault +assets_domains expiry+assetsCloudflare domainAssetIdsrc/lib/db/schema.ts:169stay in other tools. Offboarding is 4 hunts, not one export. - Invoices —
INV-12in FreshBooks detached fromprojects budgetsrc/lib/db/schema.ts:35clientId. Client asksresend last invoice— you search email, not portal.
Result: client remembers chaos, not craft. Referral rate 1:20 vs 1:4 for system handover. You lost 5 referrals/year × ₹1L avg = ₹5L for 30 min missing system.
A great project with messy offboard earns thanks. A tidy offboard earns introductions.
The Linked Offboarding Graph: Portal + Assets + Vault Rotation
In RunoSO tenant_${id} src/lib/db/tenant.ts:47, offboarding is query, not archaeology:
clients(id, status lead|active|inactive src/lib/db/schema.ts:5)
projects(clientId fk notNull onDelete:cascade src/lib/db/schema.ts:25, status active→completed src/lib/db/schema.ts:21, budget, advance, deadline, githubUrl)
tasks(projectId fk, status done src/lib/db/schema.ts:42)
invoices(clientId fk, projectId fk nullable, amount numeric, status paid src/lib/db/schema.ts:58)
vaultItems(clientId, projectId, category password|server|api-key src/lib/db/schema.ts:123, encrypted)
assetsDomains(clientId, projectId, expiryDate, autoRenew boolean src/lib/db/schema.ts:154)
assetsHosting(provider, renewalDate src/lib/db/schema.ts:197, vaultItemId fk src/lib/db/schema.ts:198)
portalTokens(tenantId+clientId unique, token, revokedAt, lastAccessedAt src/lib/db/schema-public.ts:169)The 15-minute referral-grade handover:
- Mark done. Set
projects status:completedsrc/lib/db/schema.ts:21, verifytasks 14/14 done,invoices status:paid.ClientDetailPageClientsrc/app/(dashboard)/clients/[id]/page.tsxnow shows greencompletedtimeline — client sees finish, noton-holdlimbo you left in Trello. - Asset export one view. Open
Assetssrc/app/(dashboard)/assets/page.tsx→ filterclientId=Acme→domains expiryDate autoRenew,hosting renewalDate vaultItemId,cloudflare domainAssetId,github repo visibilitysrc/lib/db/schema.ts:178,social handle vaultItemIdvisible together. Export/paste summary intoportalhandover note — no GoDaddy + Cloudflare hop. - Vault handover — rotation, not DM. Open
vaultItemsfilteredclientId=Acmemaskedsrc/app/api/vault/route.ts:25→ for eachserver/api-keylinkedhosting, rotate secret to client-ownedvaultItemif required, revoke yourvaultItemIdlink, note rotation inproject.notessrc/lib/db/schema.ts:32. Client gets credentials via their vault, not Slack plaintext history. Link showsHow to store SSH keys & API tokenssrc/lib/vault/crypto.ts:22. - Portal handover packet.
POST /api/clients/[id]/portalsrc/lib/db/schema-public.ts:169→portal/[token]holds project progresstotalTasks/doneTasks, paid invoices PDF (sendInvoiceEmail portal linksrc/lib/emails/send.ts:347), asset summary. Client self-servesresend invoice?without ping. KeeprevokedAtnull for 14 days, then revokesrc/lib/db/schema-public.ts:175— clean ownership. - Referral ask — timed, not needy. Day 3 post-delivery: message Loved shipping Acme Growth Revamp together —
portal/[token]holds everything. If you know 1 founder needing similar, intro'd love — I prioritize referred clients. Day 14 if active:personalTasks category:work isTodaysrc/lib/db/schema.ts:237reminderFollow Acme referral.clientStatusstaysactive30 days →inactivesrc/lib/db/schema.ts:5automatically if you filter, keeping win-back list warm.
Done becomes closed + referred, not delivered + forgotten.
Offboarding Checklist (Paste into project.notes → Share via Portal)
| Item | Source tenant_${id} | Done |
|---|---|---|
Projects → completed + 14/14 tasks done | projects status src/lib/db/schema.ts:21 + tasks status:done | ☐ |
Invoices paid GOS/25-26/014 | invoices status paid amount numeric src/lib/db/schema.ts:58 | ☐ |
Asset summary domains expiry autoRenew true + hosting renewal + vaultItemId | assetsDomains expiryDate src/lib/db/schema.ts:153, assetsHosting renewalDate vaultItemId src/lib/db/schema.ts:197 | ☐ |
Vault rotation server/api-key handed, your access revoked | vaultItems category server/api-key src/lib/db/schema.ts:123 AES-256-GCM | ☐ |
Portal/[token] live revokedAt null lastAccessedAt tracked | portalTokens src/lib/db/schema-public.ts:169 | ☐ |
Referral ask day 3 + day 14 task isToday | personalTasks category work src/lib/db/schema.ts:237 | ☐ |
Client status active→inactive after 30d | clientStatusEnum src/lib/db/schema.ts:5 | ☐ |
One checklist replaces Drive folder v4_final guess.
Mistakes That Kill Referrals
Mistake 1: Treating Drive link as handover.
Drive link anyone-with-link expires, no portalTokens revokedAt control, no invoices self-serve. Client re-asks Where's repo? → reminder of mess. Portal is stable single URL with lastAccessedAt proof they saw it.
Mistake 2: Forwarding vault via Slack DM.
Pasting API key in DM feels fast, trains client your vault = Slack. Insecure pattern where never store passwords https://runoso.in/blog/where-freelancers-should-never-store-passwords explains risk. Use linked vaultItems clientId/projectId handover — rotate, not forward.
Mistake 3: Asking referral at invoice moment.
Paid invoice + same message referral ask reads transactional. Separate: deliver portal packet day 0, referral ask day 3 after they felt organized handover. personalTasks scheduledDate src/lib/db/schema.ts:248 + runDailyRollover keeps ask from being forgotten.
Drive + Notion + HubSpot vs Linked Portal
| Offboarding moment | Drive + Notion + Sheets + HubSpot + 1Password flat | RunoSO tenant_${id} graph |
|---|---|---|
Where's repo? | Hunt Drive final folder → Slack DM again | projects githubUrl src/lib/db/schema.ts:34 + assetsGithub techStack src/lib/db/schema.ts:184 one dossier |
Domain expiry? | Open GoDaddy, check Sheet typo | assetsDomains expiryDate autoRenew src/lib/db/schema.ts:153 badge 14/7/3/1/0 src/app/api/cron/daily/route.ts:275 one view |
Resend invoice | Search email INV-12 | portalTokens portal/[id] shows invoices paid PDF sendInvoiceEmail portal link |
Credential staging login | DM acme-server ?? 3 entries which? | vaultItems clientId/projectId masked AES-256-GCM linked hosting vaultItemId |
| Referral generation | Hope they remember | Day 3 portal + day 14 isToday task → 1:4 referral rate you track via clients status |
Messy ending loses future; linked ending multiplies it.
Earn the Intro This Week
- Pick one
active→completedprojectdeadlinepassed. Run checklist 15 min. Generate portalPOST /api/clients/[id]/portal→ send Handover packet — progress, invoices, assets, logins — live here 14 days.- Schedule
personalTasksFollow Acme referral in 3dstatus:todoisToday→scheduledDateauto rolls until ask day. - After week, count
portal lastAccessedAtvsreferral intro. System turns done into pipeline.
RunoSO offboards referral-ready — portalTokens handover, assets summary, vault rotation, and timed referral task in one linked flow.
→ Turn Done Into Referrals — 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
- Retain before churn: retainer management for freelancers.
- Never lose credentials at exit: where freelancers should never store passwords.
- Proposal → project hygiene: freelance proposal to project handover.
FAQ
When do I revoke portal? Keep portalTokens revokedAt null 14 days → client re-download window. Then revokedAt=now src/lib/db/schema-public.ts:175 — clean ownership. Log rotation in project.notes so revive later uses new vaultItem.
What if vault has 30 items for one client? Filter vaultItems clientId/projectId category src/lib/db/schema.ts:123 — rotate only server/api-key linked hosting, archive other. Linked filter finds 3 relevant, not 200 flat list hunt.
How does this earn referrals vs just asking? Portal organization is the proof you run ops — they forward organized packet to peer. Ask without packet is favor; ask after packet is referral with evidence.



