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. Pricing Freelance Projects Profitably: Hourly vs Fixed vs Value
Finance

Pricing Freelance Projects Profitably: Hourly vs Fixed vs Value

By Gautam Parmar17 September 20268 min read
Pricing Freelance Projects Profitably: Hourly vs Fixed vs Value — featured image

You quote Acme Growth Revamp three ways in head:

  • Hourly ₹1500 × 80h = ₹1.2L — safe, but you build fast (now 60h) → bill drops to ₹90k for same value. Speed punishes you.
  • Fixed ₹1.2L for 5 pages — client loves certainty, but Add blog + shop scope creep +18h stays ₹1.2L → margin collapses.
  • Value ₹1.5L for growth revamp supporting ₹5L ad spend — scary to say, easy to discount when client says Budget ₹1L? You cave because proposal is Google Doc ₹1.5L text with no budget numeric + transactions + portal proof.

Next week you under-quote Beta at ₹80k by forgetting advance lag and hosting cost costMonthly numeric src/lib/db/schema.ts:196.

Freelance pricing pain is not math. It's quotes detached from linked budget → advance → invoice truth.

Why Notion / Excel / HubSpot Quotes Lose Profit

  • Excel/Sheets — Quote Sheet with Rate × Hours = Total text formula 1500*80 that breaks when you insert row Blog. budget 120000 typed 1.2L not numeric(12,2) src/lib/db/schema.ts:35 → FinanceOverviewClient src/components/finance/FinanceOverviewClient.tsx Recharts can't sum. advance 30000 logged elsewhere as YES text, not transactions type:income category:Project Advance src/app/api/projects/route.ts:145. You quote ₹1.2L but live cash advance unlinked.
  • Notion — Proposal template holds Pricing table as Essential ₹80k | Standard ₹1.2L | Premium ₹1.5L but no projectType dev|content|design|other src/lib/db/schema.ts:20, no deadline visibility, no githubUrl cost. You copy doc, edit price to ₹1L gut, no buffer rule.
  • HubSpot — Quote tool tracks Deal Amount 120k but not tasks todo|in-progress|done src/lib/db/schema.ts:42 hours, not assetsSubscriptions cost billingCycle monthly|yearly src/lib/db/schema.ts:225 billableTo personal|client, not assetsHosting costMonthly src/lib/db/schema.ts:196 you eat monthly. Deal Won feels profit, ops leaks it.
  • Trello/ClickUp — Time-track 80h vs 60h after fact, but quote already hourly → you punished for excellence. No invoiceStatus draft|sent|paid|overdue src/lib/db/schema.ts:58 + recurringInterval src/lib/db/schema.ts:80 for value retainer upside.

Result: you re-price from memory each proposal, anchoring to last ₹1.2L even when scope + deadline <7d premium + hosting renewal cost suggests ₹1.5L. Without linked budget/advance graph, pricing is guess, not system.

The Linked Pricing Graph: Budget → Advance → Tasks → Invoice

In RunoSO tenant_${id} src/lib/db/tenant.ts:47, price is typed FK, not prose:

clients(id)
  projects(clientId fk notNull onDelete:cascade src/lib/db/schema.ts:25, title, type, status active|on-hold|completed, budget numeric(12,2) src/lib/db/schema.ts:35, advance numeric(12,2) src/lib/db/schema.ts:36, deadline timestamp src/lib/db/schema.ts:33, description notes)
    tasks(projectId fk notNull src/lib/db/schema.ts:47, status, priority, dueDate)
  invoices(clientId fk src/lib/db/schema.ts:61, projectId fk src/lib/db/schema.ts:66, invoiceNumber unique, status, amount numeric src/lib/db/schema.ts:69, items jsonb src/lib/db/schema.ts:74, discount, taxRate, recurringInterval, recurringNextDate, currency INR)
  transactions(type income|expense src/lib/db/schema.ts:87, amount numeric src/lib/db/schema.ts:92, category, clientId, projectId, invoiceId src/lib/db/schema.ts:97)
  assetsHosting(costMonthly numeric src/lib/db/schema.ts:196, renewalDate, vaultItemId)

Price any project in 4 typed steps:

  1. Pick type and anchor. POST /api/projects type:dev|content|design src/lib/db/schema.ts:20 sets mental anchor — dev ₹1.5k/h baseline, content retainer ₹40k mo, design ₹1.2L package. Type beats gut.
  2. Set budget + advance numeric. budget 120000 advance 30000 src/lib/db/schema.ts:35 auto-creates transactions Project Advance src/app/api/projects/route.ts:145 → Finance live receivables shows funded vs unfunded before start. Sheets advance YES can't trigger cash flow view.
  3. Map tasks to price. Break scope into tasks with priority high = must for quote. 8 tasks × your ₹1500/h × 6h = ₹9k/task sanity-checks fixed ₹1.2L ≈ 13 tasks — visible undersell. Now hourly math informs fixed quote without billing hourly.
  4. Spawn invoices that reflect model. POST /api/invoices items jsonb src/lib/db/schema.ts:74 holds line mix: Discovery ₹20k + Build ₹70k + Revision buffer ₹15k + Hosting pass-through. invoiceNumber GOS/25-26/014 FY sequential + status draft→sent + sendInvoiceEmail portal link src/lib/emails/send.ts:347. Model flexibility lives in items, not scattered Sheet tabs.

Now quote is queryable history — filter projects type:design budget avg to price next ₹1.4L anchored, not guessed.

Hourly vs Fixed vs Value — With Linked Ops

ModelHow it bills in tenant_${id}When it winsTrap if no FK linkRunoSO guardrail
Hourly ₹1500/htransactions per log, no budget cap, invoices per week amount variableUndefined scope, discoverySpeed → pay cut; 60h fast = ₹90k for ₹1.2L valueUse hourly only for type:other spiking, else map to budget after 2 weeks
Fixed ₹1.2L for 5 pagesprojects budget 120000 numeric invoices projectId one amount + advance 30k syncWell-defined 5 pages, deadline 4wCreep +blog stays 120k — margin diesRequire Included/Excluded table in description + change-order flow 67 linked tasks+bump
Value ₹1.5L for growth supporting ₹5L adprojects budget 150000 advance 50000 invoices items jsonb value lines + portal proof totalTasks/doneTasksOutcome tied to client's revenue, assets SEO/domain stackScary to say without proof → discount to ₹1LShow ClientDetailPageClient dossier 7/7 done + paid past portals as proof; value = outcome / 10 anchor

No model wins alone. Mix: Fixed base budget + Value premium anchor + Hourly guardrail for creep +₹4k/revision. Linked budget/advance + items jsonb lets you blend without re-typing.

Framework:

  • Hourly floor: ₹1500 × tasks estimate 80h = ₹1.2L — never quote below.
  • Fixed with buffer: ₹1.2L + 15% uncertainty ₹18k = ₹1.38L → quote ₹1.4L — discount 0 src/lib/db/schema.ts:75 explicit, not hidden.
  • Value ceiling: Client ₹5L ad / 3 months = ₹15L spend; 10% lift = ₹1.5L value → anchor ₹1.5L with portal case Acme 23% lift proof. Close ₹1.35L feels win-win.

Without numeric(12,2) + items jsonb, you quote ₹1.2L because last quote 1.2L. With, you quote ₹1.4L because tasks 9 + buffer + hosting costMonthly says so.

Mistakes That Keep Pricing Leaky

Mistake 1: Pricing without advance.

Quote ₹1.2L NET-15 but forget advance 30k Project Advance transaction → work 15 days unfunded, cash anxiety discounts next quote to ₹1L fast cash. Always set advance numeric src/lib/db/schema.ts:36 at quote — funded start funds patience.

Mistake 2: Bundling pass-throughs silent.

Pay hosting ₹2k/mo + domain ₹1.2k/yr + Cloudflare costMonthly yourself then quote ₹1.2L all-in. Keep assetsHosting costMonthly src/lib/db/schema.ts:196 + assetsSubscriptions billingCycle separate billableTo:client src/lib/db/schema.ts:227 → invoices items Hosting pass-through ₹2400 line → margin visible.

Mistake 3: No portal proof for value.

Pitch ₹1.5L value via Doc We drive growth vague. Pitch via portalTokens portal/[token] + dossier totalTasks/doneTasks 14/14 + invoices paid 100% live — concrete. Value needs evidence graph supplies.

Pricing Table You Can Ship

Keep in project.notes as template per type:

Scope itemEffort (tasks)budget shareValue anchor
Discovery + wire 2 tasks12h₹18kPrevents scope change +₹15k later
5 pages build 5 tasks45h₹68kSupports ₹5L ad conversion
2 revisions 2 tasks10h₹15kCap; 3rd → +₹4k change-order
CMS + handover 1 task8h₹12kFuture self-serve vault value
Buffer 15%—₹17kUncertainty deadline <4w
Total budget75h₹1.3L → quote ₹1.4L₹1.5L value → close ₹1.35L

Typed table → typed projects budget → typed invoices items → typed transactions — Sheets formula never again.

Quote Profitably Next Time

  1. Duplicate last type:design project budget 135000 → set new clientId → edit tasks → budget auto suggests ₹1.38L buffer included — no amnesia.
  2. Set advance 30k (25%) → check Finance receivables pending drops.
  3. Create invoice draft items jsonb 6 lines discount 0 taxRate 0 — GOS/25-26/015 ready before client asks Send quote.
  4. Generate portal draft — attach Past portal Acme 7/7 proof line: Shipped Acme Growth 5 pages + blog CMS on budget — portal live 14 days.

Quoting becomes pulling from linked history, not pulling from gut.


RunoSO prices with linked truth — budget numeric + advance + tasks estimate + invoices items + assets costs in one graph so hourly, fixed, and value all pay profitably.

→ Quote Profitably — 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

  • Scope pays when linked: handling scope creep change orders that get paid.
  • Retain MRR predictably: retainer management for freelancers.
  • Protect handover value: where freelancers should never store passwords.

FAQ

Which model should I start with? Fixed with buffer budget numeric + 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 case proof. Linked graph supports blend; Sheets forces pick one.

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

Can I track profitability per pricing model? Yes — filter projects type + budget vs transactions income src/lib/db/schema.ts:92 + invoices status paid per clientId. FinanceOverviewClient src/components/finance/FinanceOverviewClient.tsx live tells you fixed ₹1.4L avg vs hourly ₹90k fast penalty — graph makes 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,.