You quote Acme Growth Revamp three ways in head:
- Hourly
₹1500 × 80h = ₹1.2L— safe, but you build fast (now 60h) → bill drops to₹90kfor same value. Speed punishes you. - Fixed
₹1.2L for 5 pages— client loves certainty, butAdd blog + shopscope creep+18hstays₹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.5Ltext with nobudget numeric+transactions+portalproof.
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 SheetwithRate × Hours = Totaltext formula1500*80that breaks when you insert rowBlog.budget120000typed1.2Lnotnumeric(12,2)src/lib/db/schema.ts:35→FinanceOverviewClientsrc/components/finance/FinanceOverviewClient.tsxRechartscan't sum.advance30000logged elsewhere asYEStext, nottransactions type:income category:Project Advancesrc/app/api/projects/route.ts:145. You quote₹1.2Lbut live cashadvanceunlinked. - Notion — Proposal template holds
Pricing tableasEssential ₹80k | Standard ₹1.2L | Premium ₹1.5Lbut noprojectType dev|content|design|othersrc/lib/db/schema.ts:20, nodeadlinevisibility, nogithubUrlcost. You copy doc, edit price to₹1Lgut, no buffer rule. - HubSpot —
Quotetool tracksDeal Amount 120kbut nottasks todo|in-progress|donesrc/lib/db/schema.ts:42hours, notassetsSubscriptions cost billingCycle monthly|yearlysrc/lib/db/schema.ts:225billableTo personal|client, notassetsHosting costMonthlysrc/lib/db/schema.ts:196you eat monthly. DealWonfeels profit, ops leaks it. - Trello/ClickUp — Time-track
80hvs60hafter fact, but quote alreadyhourly→ you punished for excellence. NoinvoiceStatus draft|sent|paid|overduesrc/lib/db/schema.ts:58+recurringIntervalsrc/lib/db/schema.ts:80for 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:
- Pick
typeand anchor.POST /api/projectstype:dev|content|designsrc/lib/db/schema.ts:20sets mental anchor —dev₹1.5k/h baseline,contentretainer ₹40k mo,design₹1.2L package. Type beats gut. - Set
budget+advancenumeric.budget 120000advance 30000src/lib/db/schema.ts:35auto-createstransactions Project Advancesrc/app/api/projects/route.ts:145→Financelivereceivablesshows funded vs unfunded before start. Sheetsadvance YEScan't trigger cash flow view. - Map tasks to price. Break scope into
taskswithpriority high= must for quote.8 tasks× your₹1500/h × 6h = ₹9k/tasksanity-checks fixed₹1.2L ≈ 13 tasks— visible undersell. Nowhourly mathinforms fixed quote without billing hourly. - Spawn
invoicesthat reflect model.POST /api/invoicesitems jsonbsrc/lib/db/schema.ts:74holds line mix:Discovery ₹20k + Build ₹70k + Revision buffer ₹15k + Hosting pass-through.invoiceNumber GOS/25-26/014FY sequential +status draft→sent+sendInvoiceEmail portal linksrc/lib/emails/send.ts:347. Model flexibility lives initems, 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
| Model | How it bills in tenant_${id} | When it wins | Trap if no FK link | RunoSO guardrail |
|---|---|---|---|---|
Hourly ₹1500/h | transactions per log, no budget cap, invoices per week amount variable | Undefined scope, discovery | Speed → pay cut; 60h fast = ₹90k for ₹1.2L value | Use hourly only for type:other spiking, else map to budget after 2 weeks |
Fixed ₹1.2L for 5 pages | projects budget 120000 numeric invoices projectId one amount + advance 30k sync | Well-defined 5 pages, deadline 4w | Creep +blog stays 120k — margin dies | Require Included/Excluded table in description + change-order flow 67 linked tasks+bump |
Value ₹1.5L for growth supporting ₹5L ad | projects budget 150000 advance 50000 invoices items jsonb value lines + portal proof totalTasks/doneTasks | Outcome tied to client's revenue, assets SEO/domain stack | Scary to say without proof → discount to ₹1L | Show 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 0src/lib/db/schema.ts:75explicit, not hidden. - Value ceiling: Client
₹5L ad / 3 months = ₹15L spend;10% lift = ₹1.5L value→ anchor₹1.5LwithportalcaseAcme 23% liftproof. Close₹1.35Lfeels 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 item | Effort (tasks) | budget share | Value anchor |
|---|---|---|---|
Discovery + wire 2 tasks | 12h | ₹18k | Prevents scope change +₹15k later |
5 pages build 5 tasks | 45h | ₹68k | Supports ₹5L ad conversion |
2 revisions 2 tasks | 10h | ₹15k | Cap; 3rd → +₹4k change-order |
CMS + handover 1 task | 8h | ₹12k | Future self-serve vault value |
| Buffer 15% | — | ₹17k | Uncertainty deadline <4w |
Total budget | 75h | ₹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
- Duplicate last
type:designprojectbudget 135000→ set newclientId→ edit tasks →budgetauto suggests₹1.38Lbuffer included — no amnesia. - Set
advance 30k (25%)→ checkFinance receivablespendingdrops. Create invoice draftitems jsonb6 linesdiscount 0 taxRate 0—GOS/25-26/015ready before client asksSend quote.Generate portaldraft — attachPast portal Acme 7/7proof 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.



