Ascend runs a gym, a pilates and spinning studio and a wellness club out of one building in Cuffe Parade. The whole business lived in a 33-tab Excel file. We turned it into software that the owner, the front desk and the member each get their own view of, and moved twelve years of history into it without losing a rupee.

This is the crew in Mumbai that builds what you see on this site. No stock team, no AI-generated faces.
Twelve years of memberships, personal training, classes and wellness, all of it in one Excel workbook with thirty-three tabs. It was accurate, and it was the only copy. Every renewal meant finding the right tab, reading across, and typing the same person in again.
Only one person could have it open. Everyone else waited, or worked from a copy that drifted.
Members pay half now and half later. A spreadsheet cell cannot chase a balance.
The renewal list existed, in theory, if someone sat down and built it by hand that week.
The owner wants money and retention. The front desk wants speed. The member wants their own credits and nothing else. Each one is a real, separate account, and the member view can only ever see its own record.

Lifetime collected against lifetime billed, outstanding balances, revenue by stream, and a live expiring list at four horizons: today, seven days, fifteen days, thirty days.

Search by name or phone, see today's transactions, take a payment. The whole screen is built around one question: who is standing here and what do they want.

New, renewal or day pass. If the phone is already on file the sale attaches to that member, so nobody gets a second record by accident.
What the front desk, the member and the owner each see, and how twelve years of history got there.
Gym, PT, classes and wellness in one system.
5,870 transactions carried across. 67 unclear rows flagged, never guessed.
Search by name or phone. The sale attaches to the existing member.
Half now, half later is first class. The balance follows the member.
GST at the rate that applied that day. Invoice numbers with no gaps.
Classes and credits. Cancel more than 24 hours out and the credit comes back.
Collected against billed, balances, and who expires in 7, 15 and 30 days.
Anyone can build a gym app. The job was moving a real business into it without losing a single payment, and being able to prove it.

Names replaced for this page. The counts, the amounts and the flagged rows are real.
Rs. 5,48,72,669 collected against Rs. 5,50,10,621 billed. It ties to his master tabs.
67 rows had something the parser could not resolve safely, so they were flagged instead of filled in with an assumption.
So the person checking can open the original workbook at that exact line and settle it in seconds.
The sheet name reads "Gym Memebrship" because that is what it says in the source. We match the business, we do not correct it silently.
The statutory rate moved from 18 percent to 5 percent partway through a month. The system applies the rate that applied on the sale date, not today's rate, so historic invoices stay correct forever.
Sequential per financial year. An accountant can run down the list and never find a hole, which is the first thing they look for.
Partial payments are first class. The balance is tracked against the member, GST splits at the rate that applied on the sale, and the outstanding figure on the owner dashboard is the sum of real balances.
Cancel more than 24 hours out and the credit goes back to the member automatically. No refund conversation at the desk.
People travel. A frozen membership stops counting down and picks up where it left off, which used to be a note in the margin of a spreadsheet.
Their accountant works in the old sixteen-column format for Tally. So the system writes that exact format back out, month by month. Nobody had to change how they file.

A gym desk at seven in the evening has a queue. If the software is slower than the paper it replaced, the staff go back to paper. So the whole front desk was built and measured against the clock, not against a feature list.
The owner dashboard first loaded in five and a half seconds. The cause was the security layer running a helper function on every single row. Rewritten as scalar subqueries it now loads in 0.62 seconds, and the isolation was re-tested afterwards to make sure speed had not cost safety.



