← All projects
Passion FitnessGym

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.

1.4MRows copied from the back office
119Entities kept in sync
24 minFor the first full download
−89%Home page weight

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.

01

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.

crm.gym.it/membershipsSample data
Active today0▲ +14% vs last year
Revenue this month€ 0▲ +10%
Trials → members0%
12-month retention0%

Monthly revenue (€)

DecJanFebMarAprMayJunJulAugSepOctNov

Active memberships by type

0active
  • Open47%
  • Gym + classes27%
  • Reformer16%
  • Under 2510%
NewRenewedLapsed
Dec
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov

Latest payments

  • A
    Alessia P.New · Open annual
    €549.00
02

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.

crm.palestra.it/abbonamentiSample data
Active today0▲ +14% vs last year
Trials → members0%
12-month retention0%
NewLapsed
Nov
Dec
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
03

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.

0rows copied119 entities · 24 minutes · zero errors
Club check-ins0
Class bookings0
Contracts0
Payments0
People0
04

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.

01Meta · WebsiteForms and Lead Ads
02CRMLead with consultant
03Back officeRecord created
04TrialBooked and followed

0 leads in on their own

05

A website at a tenth of the weight

Images and loading treated as a requirement, not a detail to fix later.

Before0,00 MB
After0,00 MB

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

AstroNext.jsSupabasePerfectGym APIMeta Lead Adsn8npg_cron

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

01
Interfaces
Website · Astro + MDXStaff CRM · Next.js + ReactWebsite forms · Meta Lead Ads
02
Logic
Edge Functions · sync, webhooks, leadsSQL functions for the numbersn8n · referrals
03
Data
Postgres on Supabase (London)Back-office copy · 119 entitiesCRM · leads, trials, renewals, tickets
04
External systems
PerfectGym APIAirtable (migrated)Meta Lead Ads

The pieces, one by one

01

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.

02

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.

03

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.

04

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.

05

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

10Edge Functions
78Database migrations
119Entities kept in sync
1.4MRows in the first download