Vol. 01 — 2026

First ₹10L Month 2026: Real Ledger Breakdown & Proof

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.

KEEP READING

← All journal articles Get in touch →