CA 30 mins ₹1k Profit ₹2.1L? You Which client? Which project lost? CA Excel Income - Expense — Income = invoices sum but Expense = bank debits no clientId/projectId/category. SIP ₹20k as expense → ₹1.9L understated. Hostinger ₹3k costMonthly 3000 src/lib/db/schema.ts:196 not billable → Acme 60% but true 48%. You get number, not insight.
P&L isn't one number. It's Income (invoiced+advance) - Expenses (billable+overhead+fees) = Net per month×client×project.
Why Freelance P&L Needs More Than Income - Expense
- Investments confuse profit.
investments type stock|sip|crypto|fd|othersrc/lib/db/schema.ts:267amountsrc/lib/db/schema.ts:273+transactionIdsrc/lib/db/schema.ts:275are wealth, notexpense. SheetsSIP ₹20kasExpense→ ratio15%→25%phantom. - Receivables distort.
invoices status sent|overduesrc/lib/db/schema.ts:58not yetpaidis not income. Cronsent→overduesrc/app/api/cron/daily/route.ts:49₹55k outstanding— needcash (paid)vsaccrual (sent+paid). - No linked splits.
transactions type income|expensesrc/lib/db/schema.ts:87+amount numeric+category+clientId/projectId/invoiceIdsrc/lib/db/schema.ts:97should giveAcme YTD ₹4.2L - ₹55k - ₹18k = ₹3.47L 82%. Sheets can't splitAcme vs Beta.
Without graph, P&L is guess at CA mercy.
The Linked P&L Graph
invoices(amount numeric(12,2) src/lib/db/schema.ts:69, currency INR, status draft|sent|paid|overdue, issueDate src/lib/db/schema.ts:71, dueDate, items jsonb, discount, taxRate, taxType varchar(50) src/lib/db/schema.ts:77)
transactions(type income|expense src/lib/db/schema.ts:87, amount numeric src/lib/db/schema.ts:92, category varchar(100) src/lib/db/schema.ts:94, date timestamp src/lib/db/schema.ts:96, clientId, projectId, invoiceId src/lib/db/schema.ts:97)
projects(budget numeric(12,2) src/lib/db/schema.ts:35, advance numeric src/lib/db/schema.ts:36, clientId fk)
assetsSubscriptions(cost numeric, billingCycle monthly|yearly src/lib/db/schema.ts:224, billableTo personal|client src/lib/db/schema.ts:227)
assetsHosting(costMonthly numeric src/lib/db/schema.ts:196)
investments(type stock|sip|crypto|fd|other src/lib/db/schema.ts:267, amount numeric src/lib/db/schema.ts:273, date timestamp, transactionId src/lib/db/schema.ts:275)
cron daily 30 3 * * * vercel.json:4 + FinanceOverviewClient Recharts liveThree P&L views auto:
- Monthly cash P&L.
GET /api/transactions?type=income&startDate=...&endDate=...src/app/api/transactions/route.ts:88Invoice Payment+expense Billable|Overhead|Fee→₹2.45L - ₹38.5k = ₹2.06L15.7%— matches dashboard. - Client P&L.
?clientId=xxx&type=incomevsexpensesrc/app/api/transactions/route.ts:87→TechStart ₹4.20L - ₹62k = ₹3.58L 85%vsAcme ₹2.80L - ₹95k = ₹1.85L 66%— raise or cut. - Project P&L.
?projectId=xxxsrc/app/api/transactions/route.ts:87+budget 140kvsinvoices amountvsexpense→Budget 140k Invoiced 140k Spent 62k Margin 78k 55%— noSUMIFS.
What Live P&L Looks Like (No CA)
┌────────────────────────────────────────────────────────────────┐
│ 📊 Financial Overview Apr 2026 │
│ Revenue (paid) ₹2,45,000 Expenses ₹38,500 Net ₹2,06,500 │
│ Outstanding ₹55,000 Overdue ₹15,000 Ratio 15.7% │
│ ┌─ Cash vs Accrual ─────────────────────────────────────┐ │
│ │ Cash (paid): ₹2,45,000 │ │
│ │ Sent not paid: ₹55,000 → Accrual ₹3,00,000 │ │
│ │ Overdue 21d Acme: ₹15,000 │ │
│ └────────────────────────────────────────────────────────┘ │
│ Top clients YTD net: TechStart ₹3.58L 85% | Acme ₹1.85L 66% │
│ Investments Apr: SIP ₹20k + Stock ₹15k (not in P&L) │
└────────────────────────────────────────────────────────────────┘5 mins Monday beats 30 min CA call ₹1k.
Excel vs QuickBooks vs FreshBooks vs RunoSO — P&L Truth
| Need | Excel/Sheets | QuickBooks | FreshBooks | RunoSO | ||
|---|---|---|---|---|---|---|
| P&L granularity | Income-Expense one cell | By client US | Simple | transactions clientId/projectId/invoiceId src/lib/db/schema.ts:97 → monthly×client×project | ||
| Investments vs expenses | SIP ₹20k as expense | Separate | No | `investments type sip | stock | crypto src/lib/db/schema.ts:269 linked transactionId` separate |
| Auto compute | =SUM breaks | Auto | Auto | Server subtotal - discount + tax src/app/api/invoices/route.ts:119 + computedTotal src/app/api/invoices/route.ts:127 | ||
| Overdue & recurring | Manual Overdue? | Flag | Reminder | Cron sent→overdue src/app/api/cron/daily/route.ts:46 + recurringInterval src/lib/utils/recurring.ts:5 auto MRR | ||
| India GST | Manual 9+9 vs 18 | US tax | US | `taxType cgst_sgst | igst src/app/api/invoices/route.ts:124` clean P&L | |
| Cost & charts | Free + 4h rebuild | ₹1,200/mo | ₹1,500/mo | Free 5/mo src/lib/plans/limits.ts:28 → Solo ∞ finance_charts true src/lib/plans/limits.ts:59 |
Excel gives number without why; QuickBooks/FreshBooks auto P&L but US-centric, no Project Advance sync + assetsHosting costMonthly pass-through split. RunoSO gives why per client/project with India GST.
Monthly Review 20 Minutes
- 1. Revenue vs last month.
FinanceOverviewClientRechartsincome trend Jan-Jun—Feb ₹2.8L vs Mar ₹2.45L -12%—why? 1 project completed status completedsrc/lib/db/schema.ts:21not churn. - 2. Expenses vs last month.
Overhead SaaS 8.5k→10.2k +20%—assetsSubscriptions renewalDatesrc/lib/db/schema.ts:224tool +₹1.7k— cancel? - 3. Net margin.
15.7% expense ratiohealthy<20%. If>25%,subcon ₹40kon₹1.2Lproject — price next+15%. - 4. Investments.
SIP ₹20k + crypto ₹10ksrc/lib/db/schema.ts:269—Net ₹2.06L - Investments ₹30k = Cash left ₹1.76L— notP&Lbut wealth. - 5. Outstanding.
Overdue ₹15k 12d→GET /api/invoices status overduesrc/app/api/invoices/route.ts:60— follow up before30dwrite-off risk.
Mistakes That Keep P&L Blind
One P&L for all. Income ₹5L Expense ₹1.8L Profit ₹3.2L hides Beta project loss ₹12k. Always clientId + projectId filtered P&L — graph can, Sheet pivot won't maintain.
Counting not-paid as income. sent ₹55k as income inflates accrual ₹3L vs true cash ₹2.45L — you spend ₹3L mind but ₹2.45L bank → overdraft. Track both, decide cash spend on cash only.
Forgetting platform fees. USD 2000 ₹1.70L logged income but Platform Fee ₹5k not expense — margin 57% vs true 54%. Split Invoice Payment net + Platform Fee transactions per payment.
RunoSO builds P&L from linked truth — invoices + transactions + assets + investments — so profit per client/project is live, not CA-delayed.
→ See True P&L Live — Try RunoSO Free
By Gautam Parmar — solo founder. Finance that links beats finance that guesses.
Keep Reading
- Track correctly: How Freelancers Should Track Income and Expenses.
- Categories: Expense Tracking: Categories That Reveal Profit.
- Metrics: Metrics Every Solo Business Needs.
FAQ
Cash vs accrual P&L — which to watch? Cash paid only transactions Invoice Payment src/app/api/transactions/route.ts:57 for spending decisions; accrual sent+paid invoices src/lib/db/schema.ts:58 for pipeline health. RunoSO shows both — overdue ₹15k is accrual but not cash.
Where do SIP/crypto show? Not in expense — investments type sip|stock|crypto src/lib/db/schema.ts:269 with transactionId src/lib/db/schema.ts:275 separate. P&L Net ₹2.06L → after investments Cash left ₹1.76L. Keeps expense ratio 15.7% true, not 25% phantom.
Can I export P&L for CA? Yes — GET /api/invoices + GET /api/transactions?startDate=&endDate= src/app/api/transactions/route.ts:88 paginated. Solo data_export true src/lib/plans/limits.ts:58 bulk + finance_charts true for visuals; free 5/mo src/lib/plans/limits.ts:28 tracks via checkPlanLimit src/app/api/invoices/route.ts:101.



