RunoSO - Business OS for Solo Operators LogoRunoSO
FeaturesPricingTemplatesBlogAbout
Sign inStart free
RunoSO LogoRunoSO

Run your solo business. From one place.

Built in India 🇮🇳

Product

FeaturesPricingBlogChangelogRoadmap

Legal

Terms & ConditionsPrivacy PolicyRefund PolicyCookie PolicyData Deletion

Connect

Twitter/XLinkedInInstagramhello@runoso.in
Made by RunoSO
© 2026 RunoSO. All rights reserved.
Back to Blog

Featured Articles

Build in Public

Why I Ditched Notion & Sheets to Build RunoSO

7 min read
Technical Deep-Dive

How I Built a Zero-Knowledge Vault with AES-256

10 min read
Productivity

Best Freelance Tools in 2026 — Honest Stack Review

11 min read
View all posts
  1. Home
  2. Blog
  3. Budget Planning for Freelance Projects: Profit Before You Quote
Finance

Budget Planning for Freelance Projects: Profit Before You Quote

By Gautam Parmar19 September 20268 min read
Budget Planning for Freelance Projects: Profit Before You Quote — featured image

You quote ₹1.2L for 5 pages because last was ₹1.2L. Client Add blog+shop? +18h unpaid. Pay subcon ₹30k + hosting ₹2.4k from same pot. Month-end ₹42k for 78h = ₹538/h — below ₹1500 floor.

Why Freelance Budgets Fail Before Work Starts

Three detachments kill profit before kickoff:

  • Quote detached from costs. projects budget numeric(12,2) src/lib/db/schema.ts:35 is 120000 typed in RunoSO vs ₹1.2L text + Rate×Hours that breaks on insert. No link to assetsHosting costMonthly src/lib/db/schema.ts:196 ₹2.4k/mo ×3 = ₹7.2k silent leak.
  • Advance detached from cash. Log advance YES text, not transactions category:Project Advance projectId src/app/api/transactions/route.ts:57 that syncProjectAdvance src/app/api/transactions/route.ts:21 sums into projects advance src/lib/db/schema.ts:36. Unfunded 15d → discount next quote to ₹1L — impatience tax.
  • Invoice detached from budget. invoices amount + items jsonb + discount src/lib/db/schema.ts:69 live in Invoice tab while budget in Quote tab. Overrun never becomes change-order because no projectId fk src/lib/db/schema.ts:66.

Profit needs budget → advance → tasks → invoice → transactions as one graph.

The Pre-Quote Budget Graph

In tenant_${id} src/lib/db/tenant.ts:47, budget is typed and linked:

clients(id)
  projects(clientId fk notNull onDelete:cascade src/lib/db/schema.ts:25, title, type dev|content|design|other src/lib/db/schema.ts:20, budget numeric(12,2), advance numeric, deadline timestamp, status active|on-hold|completed)
    tasks(projectId fk notNull src/lib/db/schema.ts:47, status todo|in-progress|done, priority low|medium|high, dueDate)
    invoices(clientId, projectId fk, invoiceNumber unique, amount numeric, items jsonb, discount, taxRate numeric(5,2) src/lib/db/schema.ts:76, taxType varchar(50) src/lib/db/schema.ts:77, recurringInterval varchar(20) src/lib/db/schema.ts:80)
    transactions(type income|expense src/lib/db/schema.ts:87, amount numeric, category, projectId, invoiceId src/lib/db/schema.ts:98)

Budget planning in 4 typed steps:

  1. Anchor by type. POST /api/projects type:dev|content|design src/lib/db/schema.ts:20 sets floor — dev ₹1.5k/h, design ₹1.2L, content ₹40k/mo. Type beats gut.
  2. Set budget + advance numeric. budget 140000 advance 35000 src/lib/db/schema.ts:35 auto transactions Project Advance src/app/api/projects/route.ts:145 → receivables drop. Rule advance 25-30%.
  3. Map tasks to price. 9 tasks × 8h × ₹1500 = ₹1.08L sanity-checks ₹1.2L → ₹12k buffer 10% visible. Without tasks, quote ₹1.2L for 13 tasks and bleed.
  4. Spawn invoice lines that match budget. POST /api/invoices src/app/api/invoices/route.ts:84 with items jsonb [{Discovery 20000},{Build 70000},{Buffer 17000}] → server subtotal - discount + tax src/app/api/invoices/route.ts:119 computedTotal src/app/api/invoices/route.ts:127 — no typo.

Now budget is queryable: filter projects type:design budget avg → next Shopify quote ₹1.38L anchored, not guessed.

Hourly vs Fixed vs Value — Budget Implications

Modelbudget numeric behaviorTrapRunoSO guardrail
Hourly ₹1500/hNo cap, transactions per logSpeed → 60h = ₹90k for ₹1.2L valueUse for type:other spike only
Fixed ₹1.4Lbudget 140000 + advance 35k one invoiceCreep +shop stays 140k — margin diesIncluded/Excluded in description
Value ₹1.6Lbudget 160000 + advance 50k items jsonb + portal proofNo proof → discount to ₹1.1LShow 14/14 done + paid 100% dossier

No model wins alone. Mix: Fixed base ₹1.4L + Value anchor ₹1.6L + Hourly +₹4k/revision. items jsonb holds mix.

Budget vs Actual — Without Re-typing

Flat Sheet Budget vs Actual is Budget!B2 - Actual!D2 that you update Sunday. Linked graph auto:

  • Budget: projects budget 140000 src/lib/db/schema.ts:35
  • Funded: projects advance 35000 via syncProjectAdvance src/app/api/transactions/route.ts:21
  • Invoiced: sum invoices amount where projectId + status sent|paid|overdue src/lib/db/schema.ts:58
  • Spent: sum transactions type:expense projectId src/app/api/transactions/route.ts:91
  • Margin live: Invoiced - Spent = ₹72k 51% — no SUMIFS.

GET /api/transactions?projectId= src/app/api/transactions/route.ts:88 + GET /api/invoices?page=1 src/app/api/invoices/route.ts:43 feed FinanceOverviewClient Recharts.

Excel vs QuickBooks vs FreshBooks vs RunoSO — Budget Truth

NeedExcel/SheetsQuickBooksFreshBooksRunoSO
Budget typedText 1.2L — can't sumEstimate but no advanceNo fieldbudget numeric src/lib/db/schema.ts:35 + advance + transactions sync
Task→costManual HoursNo tasksNo taskstasks projectId fk src/lib/db/schema.ts:47 maps cost
Auto computeRate×Hours breaksAutoAutoServer taxable*rate/100 src/app/api/invoices/route.ts:121
Overdue & recurringManual Overdue?Flag onlyReminderCron sent→overdue src/app/api/cron/daily/route.ts:46 30 3 * * * vercel.json:4 + recurringInterval src/lib/utils/recurring.ts:5
India GSTManual 9+9 vs 18US taxUS`taxType cgst_sgstigst src/app/api/invoices/route.ts:124` auto
CostFree + 4h rebuild₹1,200/mo₹1,500/moFree 5/mo src/lib/plans/limits.ts:28 → Solo ∞

Excel lies by typo; QuickBooks/FreshBooks auto-compute but aren't freelance project graph with advance + costMonthly. RunoSO is.

Template You Can Ship Tomorrow

Keep in projects notes:

Scope itembudget share
Discovery₹18k
5 pages₹68k
Blog CMS₹12k
Revisions₹15k
Hosting 3mo₹7.2k
Buffer 15%₹19.8k
Total 75h₹1.4L → quote ₹1.45L advance 35k

Mistakes That Leak Budget After Quote

Forgetting advance. ₹1.4L NET-15 without advance 35k → unfunded 15d → discount next to ₹1.1L. Always advance numeric at quote.

Bundling pass-throughs silent. Pay hosting ₹2.4k yourself then quote ₹1.2L all-in — hide ₹7.2k leak. Split invoices items Hosting ₹7200 billableTo:client.


RunoSO budgets with linked truth — budget numeric + advance + tasks + invoices items + assets costs — so every quote carries profit, not hope.

→ Quote With Margin — Try RunoSO Free


By Gautam Parmar — solo founder, Next.js 16 + Tailwind v4 + Neon + Drizzle + AES-256-GCM, building in public on X.


Keep Reading

  • Keep profit visible: Expense Tracking: Categories That Reveal Profit.
  • Price cases: Pricing Freelance Projects Profitably.
  • Automation: Invoice Automation Draft to Paid.

FAQ

Should beginners start fixed or hourly? Fixed with buffer budget +15% src/lib/db/schema.ts:35 + Included/Excluded guardrail. Add hourly +₹4k/revision change-order and value anchor outcome/10 as you collect portal proof. Linked graph supports blend; Sheets forces one.

How do I stop discounting under pressure? Show tasks estimate + assets lines in invoices items jsonb + past dossier proof. Make discount numeric src/lib/db/schema.ts:75 explicit ₹5k off = remove 1 revision task — never free value.

Can I compare budgets across projects? Yes — filter projects type:design + budget vs transactions income src/lib/db/schema.ts:92 + invoices status paid. FinanceOverviewClient src/components/finance/FinanceOverviewClient.tsx tells you fixed ₹1.4L avg 55% margin vs hourly ₹90k fast penalty — next quote smarter.

Try RunoSO for Free

Manage clients, invoices, vault, content, and finances — all from one beautiful dashboard.

Start free
Meet RunoSO
SaaS
Unified Workspace
Finance & Invoicing
Credentials Vault
Content Pipeline

Unified Workspace

The ultimate command center for solo operators. Replace Notion, Sheets, and password managers.

  • Unified client database
  • Real-time key metrics
  • Intuitive navigation
Start free todayLearn more about RunoSO

Featured Articles

Build in Public

Why I Ditched Notion & Sheets to Build RunoSO

7 min read
Technical Deep-Dive

How I Built a Zero-Knowledge Vault with AES-256

10 min read
Productivity

Best Freelance Tools in 2026 — Honest Stack Review

11 min read
View all posts
Meet RunoSO
SaaS
Unified Workspace
Finance & Invoicing
Credentials Vault
Content Pipeline

Unified Workspace

The ultimate command center for solo operators. Replace Notion, Sheets, and password managers.

  • Unified client database
  • Real-time key metrics
  • Intuitive navigation
Start free todayLearn more about RunoSO

Related Posts

Finance

How to Invoice International Clients from India Compliantly

Invoice international clients from India — LUT, FIRC, USD quote and IGST handling linked to transactions cleanly daily. Track in RunoSO with linked clients,.

Finance

Freelance Health Insurance & GST: What’s Deductible

Health insurance for freelancers — 80D, GST input and category mapping so premium doesn’t hide in misc expenses yearly. Track in RunoSO with linked clients,.