Case study · Karni Accounting
Two firms, one desk, and accounts that always add up
The owner runs two firms on TallyPrime and needed faster day-to-day billing and a clear view of both businesses, without changing how the accountant works in Tally.
- Client
- A two-firm trading business in India
- Sector
- Trading and distribution
- Platform
- Windows desktop application
- Year
- 2026
2
firms, with data kept strictly separate
100%
offline: no internet needed to bill
280
automated tests across the codebase
94 MB
Windows installer download
The challenge
What needed solving
Switching between two companies in Tally for every lookup and invoice slowed the counter down, and checking either firm's position meant asking the accountant.
Any new tool had to respect Tally as the source of truth, get GST right on every line, keep the two firms' records apart, and keep working when the internet doesn't.
What we built
The solution
- 01
Dashboards for each firm
A firm switcher opens a dashboard for either business, with Day Book, Parties, Products, Ledgers and voucher detail screens. Every table can be filtered.
- 02
GST sales invoices
Invoices calculate CGST and SGST or IGST per line, including mixed tax rates on one bill, and print as clean PDFs.
- 03
Goods returns and cash receipts
Returns are their own voucher type, and cash receipts are recorded and printed in the same flow.
- 04
Tally sync you can see
Data is imported read-only from TallyPrime. A sync status screen shows run history and plain-language error messages instead of silent failures.
- 05
Backups and recovery
Local snapshot backups, recovery from a damaged database and auto-start with Windows keep the counter running.
- 06
Simple installation
A standard Windows installer, slimmed from 414 MB to 308 MB installed and a 94 MB download.
Under the hood
Engineering decisions that mattered
Money without rounding errors
Every amount is stored as whole paise, never floating point, with half-up rounding applied per line exactly as GST invoices require.
Evidence-based Tally parsing
Real responses from Tally's XML interface were captured first and the parsers written against them, so the import handles what Tally actually sends.
No fake numbers
If data hasn't synced, the app says so. It never shows a misleading zero balance or a 'synced' badge it can't back up.
Separated, validated internals
A modular codebase (accounting, database, Tally and sync packages) with validated messages between the interface and the data layer, and a strict Content Security Policy for an offline app.
The result
What changed
- Billing for both firms happens from one screen, without switching companies in Tally.
- The owner can check either firm's day book and parties at any time, with or without internet.
- Tally stays the source of truth, so the accountant's workflow didn't have to change.
Technology
- Electron
- React 19
- TypeScript
- SQLite
- Drizzle ORM
- TallyPrime XML
- Vitest
Services involved
More work
Other projects
Want results like these for your business?
Share your requirement in a few lines. The right team at Immense Growth will review it and get back to you with clear next steps.