The back office copied in-house, and a CRM built on top.
First the website: fast, wired to where customers actually book and pay. Then the big step: the gym’s entire back office copied into our own database, always up to date, and the CRM moved from Airtable on top of it.
The challenge
The CRM lived on Airtable, the back office somewhere else: two truths about the same customers, data retyped, reports built by hand. And a website weighing 45 MB on first load.
The approach
The back office isn’t touched: we copy it. One initial download, then continuous updates via webhooks and scheduled jobs. On top, a custom CRM: leads from forms and Meta flow straight in, are created in the back office too, and every dashboard number has a written rule.
Live
Real screens.
The website, the app and the tools as customers and staff use them today. Tap a screen to enlarge it.
Two truths about the same customers.
Now there’s one.
Behind the login
Passion Fitness
What you only see from inside — the CRM, the member app — rebuilt and animated with anonymised sample data.
The membership dashboard
Active today versus a year ago, new and renewed against lapsed, revenue month by month. The rules live in the database, not in someone’s spreadsheet: membership, renewal and trial are defined once.
Monthly revenue (€)
Active memberships by type
- Open47%
- Gym + classes27%
- Reformer16%
- Under 2510%
Latest payments
- AAlessia P.New · Open annual€549.00
The membership dashboard
Active today versus a year ago, new and lapsed over recent months. The rules live in the database, not in someone’s spreadsheet: membership, renewal and trial are defined once.
The back office, in-house
The first download: every back-office table copied in 24 minutes. From then on it updates itself, and every CRM page reads instantly instead of asking the back office.
From Meta lead to back office
Whoever fills a form on Instagram or the website lands in the CRM with a consultant already assigned, and is created in the back office too. Nobody retypes anything.
0 leads in on their own
A website at a tenth of the weight
Images and loading treated as a requirement, not a detail to fix later.
What we built
- 01Website with blog, bookings and checkout wired to the back office
- 02Full copy of the back office, updated by webhooks and scheduled jobs
- 03CRM moved from Airtable: leads, trials, renewals, debtors, tasks, meetings
- 04Website and Meta form leads straight into CRM and back office
- 05Membership dashboard: active, new, lapsed, retention, duration
- 06Tickets, roles and permissions, and an “Updates” page for staff
Technology
How it’s built
Under the hood.
The back office copied into Supabase, a Next.js CRM built on top, and an Astro website pointing to where people actually book and pay. The same setup born for Athlon, brought here.
The architecture, layer by layer
The pieces, one by one
Astro + MDX
The website
Blog and course pages written in MDX, images optimised at build time: the home page went from 45.49 MB to 4.93 MB.
The back-office copy
All of PerfectGym, in-house
Edge Functions download the PerfectGym API entity by entity with a cursor: if interrupted, they resume where they stopped. Webhooks keep the data fresh. First download: 1.4 million rows in 24 minutes.
Rules in the database
Numbers that don’t depend on who looks
What a membership, a renewal or a trial is: defined once, in SQL functions. Dashboard and CRM read the same rules.
From Airtable to the CRM
Migration without downtime
The Airtable CRM was moved into the database and kept automatically in sync throughout the switch: not a single day of downtime for staff.
Automatic leads
Nobody retypes
Website forms and Meta Lead Ads land in the CRM with a consultant assigned, and the customer record is created in PerfectGym too.
In numbers
Got a similar process?
Let’s talk→