First ₹10L Month 2026: Real Ledger Breakdown & Proof
Quick Answer: My first ₹10L month closed in September 2026 at ₹10,42,000 gross across 11 invoices, with ₹3,86,400 in real costs and ₹6,55,600 net before tax. A 90-day JSONL ledger tracked every rupee, every day. Two AI builds and four retainers carried the month, not one lucky project.
Author: Deepak Bagada — founder of SaaS Next, creator of Curro, in Junagadh, Gujarat. I have shipped 40+ production builds, and I publish revenue numbers because most "how I made ₹10L" posts hide costs.
Key Takeaways
- Gross is not income. ₹10,42,000 gross became ₹6,55,600 before tax after ₹3,86,400 of contractors, servers, tokens, tools, compliance, and travel.
- Four retainers paid the base. ₹3,57,000 of recurring work covered rent, salaries, and servers before a single new project invoice cleared.
- Two builds paid the gap. A ₹2,85,000 AI agent build and a ₹2,40,000 Laravel rebuild supplied 50% of gross but 71% of net profit.
- Cash lag nearly broke the month. A ₹2,50,000 invoice sat unpaid for 41 days, and I covered payroll from Curro subscription revenue instead of project cash.
What ₹10L Actually Means After Costs
I track revenue and cost in the same file because separating them lets you lie to yourself. A ₹10L month with ₹8L of subcontract cost is a ₹2L month with extra paperwork. This is the real September 2026 cost ledger, reconciled against my bank statement every Friday at 18:00.
| Cost line | September 2026 | Notes |
|---|---|---|
| Two contractors (Laravel, design) | ₹1,45,000 | 22 and 14 days, paid per milestone |
| Hostinger VPS, Cloud, backups | ₹18,400 | Four client environments plus staging |
| LLM and API tokens | ₹31,600 | Two agent builds, eval runs, retries |
| Tools (GitHub, Figma, Sentry, Linear) | ₹12,900 | Annual plans amortized monthly |
| GST filing, CA fees, compliance | ₹22,500 | Quarterly filing plus notice response |
| Lead generation (content, ads) | ₹26,000 | Two sponsored newsletters, one ad test |
| Lab rent, internet, electricity | ₹34,000 | Junagadh office, 1Gbps fiber |
| Hardware amortization | ₹24,000 | Two laptops and a test phone over 36 months |
| Travel and client visits | ₹18,000 | Rajkot, Surat, Ahmedabad |
| Payment gateway and bank fees | ₹13,000 | 2% on card and international payments |
| Buffer and one refund | ₹41,000 | A scope dispute I settled rather than fight |
| Total costs | ₹3,86,400 | 37% of gross |
That 37% ratio is higher than my 2025 average of 29% because I subcontracted more design work to protect two parallel builds. The buffer line is not padding; it covers the client who renegotiates after delivery.
GST is collected on top and paid out separately. The ₹6,55,600 net is before income tax, advance tax, and the 30% I move into a separate account on the first of every month. The version where the founder keeps all ₹10L does not exist.
The Revenue Ledger: 11 Invoices, Line by Line
| Client and work | Type | Invoice | Amount |
|---|---|---|---|
| Rajkot D2C brand, catalog AI agent | Build | SN-2609-01 | ₹2,85,000 |
| Ahmedabad SaaS, Laravel and Inertia rebuild | Build | SN-2609-02 | ₹2,40,000 |
| Junagadh CA firm, document agent retainer | Retainer | SN-2609-03 | ₹85,000 |
| Surat textile exporter, catalog sync | Retainer | SN-2609-04 | ₹75,000 |
| Three maintenance retainers | Retainer | SN-2609-05 to 07 | ₹1,35,000 |
| Consulting and two architecture audits | Service | SN-2609-08 to 09 | ₹1,60,000 |
| Curro subscriptions (MRR) | Product | SN-2609-10 to 11 | ₹62,000 |
| Total gross | ₹10,42,000 |
The concentration risk is obvious: the two builds are 50% of gross, and if either slipped to October the month would land near ₹7.5L. A ₹10L month is not proof of a durable business; it is proof that four retainers plus two well-priced builds can stack in 30 days.
The recurring base matters more. ₹3,57,000 arrived whether I sold anything new or not, covering contractors, servers, and my own draw. New builds are upside, not survival.
How the 90-Day JSONL Ledger Works
Every invoice, cost, and refund gets one line in a monthly JSONL file. I started this in July 2026 after a GST mismatch cost me three weeks of follow-up. The format is boring on purpose: one append-only JSON object per line, committed to a private repo daily.
{"ts":"2026-09-02T10:14:00+05:30","type":"invoice","client":"Rajkot D2C","invoice":"SN-2609-01","gross_inr":285000,"status":"paid"}
{"ts":"2026-09-04T16:40:00+05:30","type":"cost","vendor":"Contractor A","cost_inr":87000,"note":"Laravel milestone 2"}
{"ts":"2026-09-11T09:05:00+05:30","type":"invoice","client":"Junagadh CA firm","invoice":"SN-2609-03","gross_inr":85000,"status":"paid"}
{"ts":"2026-09-18T18:22:00+05:30","type":"cost","vendor":"LLM provider","cost_inr":31600,"note":"agent eval and retry runs"}
{"ts":"2026-09-27T12:31:00+05:30","type":"refund","client":"Surat exporter","cost_inr":41000,"note":"scope dispute settlement"}
The report script below is the one I run every Friday. It is deliberately small enough to read in one sitting, and it fails loudly on malformed JSON instead of silently skipping a line.
<?php
// scripts/ledger-report.php
declare(strict_types=1);
$path = $argv[1] ?? 'ledger/2026-09.jsonl';
$gross = 0;
$cost = 0;
$rows = 0;
foreach (file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
$entry = json_decode($line, true, 512, JSON_THROW_ON_ERROR);
$rows++;
$gross += (int) ($entry['gross_inr'] ?? 0);
$cost += (int) ($entry['cost_inr'] ?? 0);
}
printf(
"entries=%d gross=₹%s costs=₹%s net=₹%s\n",
$rows,
number_format($gross),
number_format($cost),
number_format($gross - $cost)
);
php scripts/ledger-report.php ledger/2026-09.jsonl
# entries=47 gross=₹10,42,000 costs=₹3,86,400 net=₹6,55,600
When I am on a client site and only have a terminal, I use jq instead. Both commands must return the same numbers, or I know a line is malformed before I make a decision on it.
jq -s '{gross: (map(.gross_inr // 0) | add), costs: (map(.cost_inr // 0) | add)}' \
ledger/2026-09.jsonl
The ledger does one job: it tells me whether a month is real. In August I thought I had ₹7.8L until the file showed ₹2.1L of invoices stuck in "sent" status. Collected cash was ₹5.7L, and that changed how I priced the next two projects.
War Story: The ₹2,50,000 Invoice That Sat for 41 Days
On 4 September 2026 I delivered a Laravel and Inertia rebuild to an Ahmedabad SaaS client and raised invoice SN-2609-02 for ₹2,40,000 plus ₹10,000 in approved change orders. The work passed UAT on 6 September. The money arrived on 15 October, 41 days later, after four follow-ups and one escalated call with their finance head.
The delay was not a dispute about quality. Their accounts team rejected the invoice because the GSTIN had one transposed digit. That error pushed the file into manual review, then their quarterly TDS batch. I had ₹1,10,000 of contractor payouts due on 30 September and covered them from Curro's MRR.
I changed three things after that month. Every invoice now goes through a GSTIN checksum validation before it leaves my desk. Builds are billed 40% upfront, 40% at UAT, and 20% at 30 days. And I keep a rolling 45-day cash buffer, which lets me sleep. The client red flags guide covers the payment signals I screen for on discovery calls.
War Story: The ₹14,800 Token Bill in Nine Hours
On 21 September, during the Rajkot agent build, a retry loop in my eval runner called the model API without a per-job budget. A schema edge case made the validator reject every response, so the job retried, failed, and retried again. Between 11:20 and 20:30 IST the loop burned ₹14,800 in tokens on a task that should have cost ₹400.
I caught it because Sentry fired 1,842 identical validation errors, not because of a billing alert. The fix was a hard token ceiling per job, a retry cap of three, and a daily spend alert at ₹1,500. I also moved eval runs to a queue with one worker so a runaway job cannot saturate the API key.
The personal cost was worse than the bill. I slept 4.5 hours for eleven straight days, skipped gym, and ate dinner at my desk four nights a week. A ₹10L month on that schedule is not repeatable. The solo founder health routine is the system I rebuilt in October.
When NOT to Use This
Do not use this ledger as a template for your own pricing. My cost base, client mix, and Junagadh overhead are specific to me. A solo developer in Bengaluru with ₹80,000 rent and no contractors will have a different break-even, and a two-person studio will have different fixed costs.
Do not chase gross revenue as a goal. A ₹10L month with one client at 60% of revenue is a fragile month with good marketing. I would trade this month for ₹6L spread across eight clients, because the second version survives a single cancellation.
Do not copy this if you are salaried and testing a side project. The hours behind this number were 61 per week, and the cash lag means you can be profitable on paper and still miss a payment. Build the buffer first.
Do not treat this as financial or tax advice. I am a developer, not a CA. GST, TDS, advance tax, and the 44ADA presumptive scheme all depend on your entity structure. Hire a CA before you cross ₹20L annual revenue.
The Pricing Mistakes Behind the Number
September did not fix my pricing; it collected on fixes from a bad first year. I billed hourly for a Rajkot textile client in 2023, logged 96 hours against a ₹55K quote, and made ₹190 per hour before costs. The pricing mistakes breakdown covers the fixed-price model I moved to.
The second fix was refusing projects without a written acceptance criterion. Two of the eleven September invoices were change orders that existed only because the original scope said "dashboard improvements" instead of naming the screens. Vague scope is not a client problem; it is a quoting problem.
The third fix was raising the floor on AI work. My agent builds now start at ₹1,85,000 because evals, retrieval tuning, and rollback plans are real engineering hours. If a buyer wants a ₹40,000 prototype, I point them to a form and a cron job. The AI development service page lists what the ₹1.85L scope includes.
Frequently Asked Questions
How much of the ₹10L month was actual profit?
₹6,55,600 before income tax, after ₹3,86,400 of operating costs. That is a 63% net margin on gross, which is higher than my 2026 average of 58% because two builds had low subcontractor hours. It is not take-home pay. Advance tax and the 30% reserve come out of that figure.
How does a JSONL ledger help a solo founder?
It forces every invoice and cost into one append-only file with a timestamp, so gross revenue cannot hide unpaid invoices. My August report showed ₹7.8L billed but ₹5.7L collected. That gap changed my pricing and my cash buffer, and it took one command to see.
What did client acquisition cost in that month?
₹26,000, split between two sponsored newsletters and one ad test. Every closed deal came from referrals or existing clients, not from the paid spend. I keep the line small because referral work converts better for me than cold ads, and I would rather ship a case study than bid on keywords.
Is a ₹10L month sustainable for a solo founder in Junagadh?
Not at 61 hours a week, and not with 50% of revenue from two builds. September was a stacked month, not a baseline. My 2026 median is ₹6.4L gross with a ₹4L cost base. The sustainable target is ₹8L across six clients at 45 hours, which I am testing this quarter.
Bottom line
My first ₹10L month was ₹10,42,000 gross, ₹3,86,400 in costs, and ₹6,55,600 before tax, tracked daily in a JSONL ledger that reconciles to my bank account every Friday. The number is real, and so is the 41-day cash gap and the eleven-day sleep debt behind it. Build the ledger before you build the revenue target, because gross without collection dates is just a story you tell at dinner.