Case study Fitness · Mumbai · Studio operating system

Thirty-three spreadsheet tabs.
One system.

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.

Ascend
Cuffe Parade, Mumbai · gym, PT, classes, wellness
The Ascend gym floor
Owner dashboard
Members carried across
1,355
Front desk sale
1.3s
1,355
members, one record each
5,870
transactions imported
99.7%
of billed value reconciled
4
revenue streams in one place
Manan Mehta with the AI Crew team in the Mumbai office
From our office
Real people. Real office.

This is the crew in Mumbai that builds what you see on this site. No stock team, no AI-generated faces.

The Ascend reception desk
The real question: a member walks in to renew. How long before they can walk back out?
01 · The situation

A spreadsheet can hold the data. It cannot run the desk.

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.

table_chart
One file, one person

Only one person could have it open. Everyone else waited, or worked from a copy that drifted.

account_balance_wallet
Partial payments everywhere

Members pay half now and half later. A spreadsheet cell cannot chase a balance.

schedule
Nobody knew who was expiring

The renewal list existed, in theory, if someone sat down and built it by hand that week.

02 · What we built

Three people. Three different screens.

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.

Owner dashboard
Screen 01
The owner

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.

Front desk today view
Screen 02
The front desk

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 sale screen
Screen 03
The sale

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.

account_treeHow Studio OS works

One member record. Three screens on top of it.

What the front desk, the member and the owner each see, and how twelve years of history got there.

Comes in
33-tab Excel workbookTwelve years of history
personA member at the deskNew, renewal or day pass
smartphoneThe member's phoneMagic link login
fitness_center

Ascend Studio OS

Gym, PT, classes and wellness in one system.

  • check_circleThe importer flags what it cannot resolve
  • check_circleGST at the rate on the sale date
  • check_circlePartial payments tracked per member
Goes out
dashboardOwner dashboardBilled, collected, expiring
receipt_longReceipt in 1.3 secondsNo gaps in invoice numbers
event_availableMember bookingsCancel early, credit back
table_viewTally-format exportThe accountant changes nothing
Import
01Move twelve years in

5,870 transactions carried across. 67 unclear rows flagged, never guessed.

Desk
search02Find who is standing there

Search by name or phone. The sale attaches to the existing member.

Desk
point_of_sale03Take the payment

Half now, half later is first class. The balance follows the member.

System
receipt_long04Receipt in 1.3 seconds

GST at the rate that applied that day. Invoice numbers with no gaps.

Member
smartphone05Book from their phone

Classes and credits. Cancel more than 24 hours out and the credit comes back.

Owner
monitoring06Watch the money

Collected against billed, balances, and who expires in 7, 15 and 30 days.

Built withNext.jsSupabaseshieldRow level securitypaymentsPayUkeyMagic link logininstall_mobilePWA on a phone
03 · The hard part

Twelve years of history, to the paisa.

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.

Data review screen

Names replaced for this page. The counts, the amounts and the flagged rows are real.

Every row reconciled against the source

Rs. 5,48,72,669 collected against Rs. 5,50,10,621 billed. It ties to his master tabs.

99.7%
The importer never guesses

67 rows had something the parser could not resolve safely, so they were flagged instead of filled in with an assumption.

67 flagged
Each flag shows its own sheet and row

So the person checking can open the original workbook at that exact line and settle it in seconds.

Traceable
The typos came across too

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.

Faithful
04 · The details that decide it

Gym software fails on the boring things.

GST that knows what day it is

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.

Invoice numbers with no gaps

Sequential per financial year. An accountant can run down the list and never find a hole, which is the first thing they look for.

Half now, half later

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.

A cancelled class returns a credit

Cancel more than 24 hours out and the credit goes back to the member automatically. No refund conversation at the desk.

The freeze module

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.

The sheet still gets fed

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.

Printed receipt
The test that mattered

New sale to printed receipt, one point three seconds.

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.

Next.jsSupabaseRow level securityPayUMagic link loginPWA on a phone
05 · What changed

The business stopped living in one file.

Before
  • closeOne Excel file, thirty-three tabs, one person at a time
  • closeRenewals found by reading across a sheet
  • closeOutstanding balances known only by memory
  • closeNo way for a member to see their own credits
After
  • check1,355 member records, four streams, one system
  • checkExpiring memberships on the dashboard at four horizons
  • checkRs. 8,88,307 outstanding, itemised across 329 balances
  • checkMembers book and cancel classes from their own phone
One number we are quietly proud of

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.

Case studies · built by the crew

More case studies. All live.

All case studies
Spinning studio
Reformer pilates
Wellness consultation
Gym floor