Camps
One record for every camper
582 camp sign-ups resolved to 425 people, with attendance, spend, and loyalty calculated on each record.
01
The problem
A recurring tennis camp kept years of participant history in spreadsheet exports. The same person was logged more than once under slightly different name spellings. There was no reliable answer for how many unique people had attended, who the repeat guests were, or what each person had spent.
02
What we built
A relational Airtable CRM. One Participants record per person. One Participations record per camp attended. Loyalty status calculated from the camp count. A File Uploads table ready for the next roster.
03
How it works
Raw rows are matched on a normalised email and name, so each person keeps a single record. That record rolls up camps attended, lifetime spend, first camp date, and most recent camp date. Each booking stays linked underneath, with camp name, dates, cost, and city. A possible-duplicate flag catches later collisions. Loyalty status, including Frequent Guest, is a formula, not a tag someone maintains by hand.
04
Outcome
582 sign-ups became 425 unique participants. No duplicate records were flagged on the imported set. The history covers about 2.25 years, from March 2021 to June 2023, across camps in Warsaw, Gdynia, Łódź, Poznań, Wrocław, Gdańsk, and other cities. The most frequent attendee has 7 recorded visits. This build is the clean history and the loyalty score. It is not a live booking or payments desk.
Inside the build
Screens from the live base: what the team sees, how records link, and what runs in the background.
Want something similar?
Book an audit and describe the workflow that is straining. We will say honestly if a build like this fits.

