Articles · App ExamplesUpdated September 2026

A gym membership app is a door, a billing cycle and a cancel button.

Most gym membership app projects start at the check in screen and stall in the billing table. That is the wrong order. A membership is a promise about money and time: what the member pays, when it renews, what a freeze does to the next charge, how fast they can get out of it. Of everything people ask fitness app builders for, this is the category where the hard rules come from outside the product. Apple decides how you take the money. State law decides how fast you let a member leave.

This page covers the four records a membership needs, what has to happen at the turnstile in under four seconds, the cancellation deadlines counted in business days, and why gym dues do not belong in in-app purchase.

See which cancellation window is open

The short version

The check in is the easy part. The renewal and the cancel are where it breaks.

The app has to answer three questions without hesitating. Is this person allowed in right now. What are they charged and on what date. Has anyone asked us for something we have a legal deadline to honour. Most homemade versions answer the first, keep the second in a spreadsheet and leave the third in email.

Two of those answers are constrained from outside. Apple's guidelines say a physical service consumed outside the app must be paid for by something other than in-app purchase. Health club statutes fix how many business days you have to accept a cancellation. Both shape the data model, not just the copy.

A membership is four records, not one status field

The most common design error in a fitness membership app is one row per member with a status column reading active, frozen or cancelled. It cannot answer the questions you will actually be asked. Which plan were they on in March. Who approved the freeze and until when. Why was the April charge different from the May one.

Use four records instead. The person: identity, photo, emergency contact, waiver date. The agreement: plan, price, start date, term, and the cancellation notice shown at signup. The billing schedule: one row per expected charge with its own state, so a declined card is a fact about one charge rather than about the member. The entitlement: what this person may do today, which is all the door reads.

Keep the agreement immutable. When someone moves from monthly to annual you end the old agreement and write a new one, you do not edit the price in place. Every dispute you will have is about which terms applied on a date, and a row you overwrote cannot tell you. That discipline is what any serious membership management app is built on.

The door has about four seconds

A gym check in app is judged at six on a Monday evening with eleven people in the queue. The scan has to work when the phone has no signal in a basement gym, when the screen is cracked, and when nobody is on the front desk.

What holds up in practice is unglamorous. A credential the phone can render offline, so the queue does not depend on the network. A barcode format the cheap scanner already at your desk can read, not a protocol needing new hardware. And a server side check that runs after the door opens rather than before: let a stale credential through and reconcile a minute later, because blocking a turnstile on a network call produces the queue you were avoiding.

Store each check in as an event with a timestamp, a location and the credential used, never as a counter you increment. You will want the history for capacity limits, class attendance, lapsed member follow up, and the argument about who was in the building that evening. An employee time clock app has the same shape at the staff door and keeps raw events for the same reason.

Decide early what a lapsed membership does at the door. Refusing silently tells the member nothing and sends them to the desk anyway. Opening and flagging the account to staff is usually kinder, and it is a policy choice, so keep it where you can change it without shipping a build.

Cancellation is a deadline, counted in business days

New York's health club law is a useful yardstick because it is specific. A contract for services may be cancelled within three business days after the buyer receives a copy of the written contract, and the contract has to carry that notice in at least twelve point bold type. All moneys paid are refunded within ten business days of receipt of the notice.

Renewals get their own clocks. Where the contract renews annually, the club has to accept cancellation of the renewal if the request comes within fifteen business days after the renewal takes effect. Where it renews monthly, that window is three business days. Past those windows the standing grounds remain: the estate may cancel on death, and the buyer may cancel on a significant physical disability beyond three months on a doctor's order, on moving more than twenty five miles from any club the seller operates, or when the services stop being available as described.

Two things follow for the build. The law names the channels: cancellation has to be accepted by website, electronic mail, telephone, mail or in person, and a club that lets people join through its website has to accept cancellation there too. The statute says website, not app, so if you sell memberships inside an app, have counsel read it rather than guessing. And a cancellation is a dated request with a clock attached, so it belongs in the database the moment it arrives, with a received timestamp and a deadline, not in a support inbox.

New York General Business Law, Article 30, section 624: rights of cancellation of contracts for services

Try it

Which cancellation window is open

New York counts three separate windows, all in business days. Support cannot answer a member until the app knows which clock they are on.

The club has to accept it

This window is 3 business days. Notice inside the window is a cancellation, and moneys paid are refunded within ten business days of receipt.

Why gym dues do not go through in-app purchase

This is the question that stalls the most projects, and the App Store Review Guidelines answer it directly. Guideline 3.1.1 requires in-app purchase when you unlock features or functionality within your app, naming subscriptions and access to premium content as examples. Guideline 3.1.3(e) covers the other case: if your app enables people to purchase physical goods or services that will be consumed outside of the app, you must use purchase methods other than in-app purchase to collect those payments, such as Apple Pay or traditional credit card entry.

Gym access is a physical service consumed outside the app, so 3.1.3(e) is the rule for dues. In-app purchase is not merely unnecessary there, it is the wrong mechanism, and the commission question answers itself. The mixed case is a health club app that also sells something digital, such as an on demand video library: that part is in-app content and 3.1.1 applies. Note that 3.1.1 also names QR codes among the mechanisms you may not use to unlock in-app content, so the barcode at your turnstile is fine while a barcode that unlocks a paywalled video is not.

Read 3.1.3 in full before designing the payment screen, because it also limits how you may point members at outside payment from inside the app, with an exception for the United States storefront. Then plan the money before the interface: whether dues land on the join date or the first of the month, what a freeze does to the next charge, how a declined card is retried and what the member sees meanwhile. Those are your recurring membership fees in practice, and they are harder to change later than any screen.

Apple App Store Review Guidelines, 3.1.1 In-App Purchase and 3.1.3(e) Goods and Services Outside of the App

What each option actually gives a gym

OptionDoor check inMember can cancel in the appYour own freeze and plan rulesDues taken outside in-app purchase
Paper contracts and a spreadsheetstaff look you upNoYesYes
Turnstile hardware with its own fobsYesNoNonot its job
All in one gym management platformYeson some plansthe platform's rulesYes
Generic booking app plus a spreadsheetNoNoNoYes
A membership app you buildYesYesYeswith a processor you add

Building one around your own gym

Gym platforms are built for chains, priced per location, and shaped around classes and bookings. A single site with four hundred members needs a fraction of that, plus two or three things the platform will not do: the corporate rate for one employer only, the founding member price you promised in year one, the freeze policy you actually operate rather than the one in the dropdown.

Newly is an AI app builder. You describe the app in plain English, including the plan rules and the cancellation channels you have to honour, and it writes a real React Native and Expo project you own, then ships it to TestFlight for iOS and to Google Play internal testing for Android, with a standalone production APK if you want one. It is $25 a month and there is no free plan. Two limits matter here: there are no built-in payments, so the card processor is something you wire in yourself, and iOS distribution needs your own Apple Developer account.

The code is yours in the ordinary sense. Install the CLI with npm i -g @newly/cli, then run newly pull with your project id. That pull is one way and there is no GitHub sync, so decide early where the source of truth lives. For a gym app that matters, because the billing edge cases are the part you will still be editing by hand in two years.

Questions people ask about gym membership apps

Four things, in rising order of difficulty. Say whether a person may come in right now. Hold the agreement they signed, with the price and the cancellation notice shown to them. Run the billing schedule, one row per expected charge. And record dated requests such as freezes and cancellations with the deadline attached. Class booking is the easy part and usually gets built first anyway.

Describe the membership you actually sell

Write down the plan rules, the freeze policy and the cancellation windows you have to honour, then build the app around those instead of around a template.

Start building