Plan for 120: Cycling Coach is an indoor cycling app for adults. This policy covers the iOS and Android app and this website. If you live in Washington, Nevada or another state with a consumer health data law, our Consumer Health Data Privacy Policy covers your health data in the form those laws ask for.
Who we are
Plan for 120 is made by Xin Li, who decides how your data is used — the controller, in the GDPR's terms. Write to support@planfor120.com about anything in this policy.
The short version
You can try the app for three days without an account; to keep riding after that you need one, which starts a free month. Your rides live on your phone, and a ride needs no network — except on a locked iPhone, whose lock screen keeps up with each step only while you are signed in and online. If you choose to sign in, your rides are also copied to our database so a second device can see them. The heart rate your watch measured reaches our servers only if you tick Store my heart rate in my account. There is no analytics SDK, no advertising and no tracking, and your rides reach no third party unless you send them there yourself, as you can to Fitbit. We do not sell or share your data, and we never see your payment card.
What stays on your phone
By default, everything. The app keeps a database on the device holding your bike setup, your rider settings, any workouts you have written, and every ride you have finished. That database is inside the app's own storage, which iOS and Android keep out of reach of other apps. If you never sign in, we have no copy of it and cannot see it. A backup file you save from Settings goes wherever you choose to put it, and never to us.
Sharing a workout
If you share a workout you wrote, the link you send contains that workout, the resistance range of the bike you wrote it on, and one number the app uses to fit it to whoever opens it: its estimate of what you can sustain, in watts. Nothing else about you is in it — no name, no weight, no rides. It goes wherever you send it and we keep no copy; if it is opened in a browser rather than the app, this website receives it the way it receives any page address.
What we store, if you sign in
An account carries your history between devices, and it is what the free month and a subscription are tied to. Creating one stores the following on our servers, hosted by Supabase.
| What | Why it exists |
|---|---|
| Your email address, and a hash of your password | To let you sign in again, and to send the codes that confirm your account and reset your password |
| Bike setup and rider settings — resistance range, bike name, weight, your age if you give one, how long you have been riding, what your rides have taught the app about your fitness, your weekly goal and any plan you start, and preferences such as units and audio cues | So a second device gives you the same numbers as the first |
| Finished rides — the workout, the timings, the estimated effort, when you sent it to a health app, and anything you add afterwards, such as how the ride felt, a figure you corrected or what your bike's console showed | Your history, and the trend the Stats tab draws |
| The heart rate and energy your watch measured during a ride — only if you tick Store my heart rate in my account | So your other devices can show them. See Health data |
| Workouts you wrote yourself | So they follow you to another device |
| Your referral code; and for each friend who used it, when they signed up, first rode and first subscribed | To credit the free days an invite earns. The app of whoever invited you reads those three dates to count their days — never your email or your rides |
| Your subscription — which plan, when it renews or expires, and Apple's reference number for it | To know whether the app is paid for. It comes from Apple: sent by Apple's servers, or passed on by the app exactly as Apple signed it |
| The date you first installed the app, and how much free time you had left when you first subscribed | So that reinstalling does not start the three free days again, and so that subscribing never costs you free days you had not used yet |
| The date your account was created | It dates your free month, which runs from signing up rather than from installing |
| On iPhone, an identifier Apple gives this app for your Apple Account, and the date the first account made with it was created | So the free month is one per Apple Account rather than one per email address. It is Apple's own opaque id — not your name, your Apple Account address, or anything we can read anything else out of — and with its date it is the one row that outlives a deleted account, because deleting it would otherwise start a second free month |
| While a ride runs on a locked iPhone: the address of that ride's lock-screen display, and what it should show at each coming step — the step's name, resistance, cadence and timing | So the lock screen turns over at each step. Each row is deleted within an hour of the step it was for |
| Anything you type into the feedback box | Because you sent it to us on purpose |
Every one of those rows is protected by row-level security in the database, which means the rules that keep one rider out of another rider's history are enforced by the database itself rather than by the app asking politely.
Your weight is in that list because the app uses it to estimate your speed and distance, and to make its first estimate of what you can sustain before your rides refine it. Your age, if you give it, is used only to estimate your maximum heart rate and to pace a plan. Neither is shared with anyone.
Health data
Apple Health and Apple Watch. If you allow it, a finished ride is written to Apple Health as an indoor cycling workout — its energy, distance, power and cadence, and a heart rate only if you entered one yourself — so it counts toward your rings like any other. The app also reads back what was recorded during that ride — heart rate, energy, and any workout another app, such as your watch's Workout app, filed for it — for the minutes of the ride you just finished, and nothing else. If the app is on your Apple Watch, the watch measures your heart rate and energy as you ride and sends them straight to your phone, saving no workout of its own. All of that happens on your phone and your watch. You can revoke Health access in the iOS Health app, and the ride still records normally without it.
Your heart rate in your account. Heart rate, and the energy a watch works out from it, are health data, so they reach our servers only if you tick Store my heart rate in my account under Settings → Account. It is off until you turn it on. With it on, they are stored with your rides so that your other devices can show them; with it off, they never reach our servers. Untick it at any time and the app sends your rides up again without them, which removes them from our servers — the copy on your phone stays where it is. While your access has ended the app sends nothing up, so write to us then and we will remove them. A few numbers the app learns partly from your watch are stored either way: its estimate of what you can sustain, in watts, and — only if you accept one after a ride — a calibration of your bike's power or of how efficiently you pedal. They are single numbers, not the readings, and part of your rider settings above, so that every device asks you for the same efforts. In the GDPR's terms this is health data processed on your explicit consent, and withdrawing that consent does not affect what was done before you withdrew it.
Health Connect, on Android. If you allow it, a finished ride is saved to Health Connect as a stationary bike session — when it started and ended, and its calories, distance, power and cadence — with a heart rate only if you entered one yourself. The app also reads back, on your phone, what was recorded during that ride — heart rate, active calories, and any workout another app, such as Samsung Health, filed for it — looking only at the time around a ride it recorded. It asks to read those three and nothing else. You can withdraw any of these permissions, or delete a ride the app saved, in Health Connect's own settings, and the ride still records normally without them.
Health data is never used for advertising or marketing, never sold, and never shared.
Fitbit, through the Google Health API
Optional, and off unless you connect it. If you do, a finished ride is written to your Fitbit account as a stationary bike exercise — when it started and ended, how long it lasted, and its calories and distance — each time you choose to send one, or after every ride if you set it to. The permission asked for is write-only: the app can add a workout and cannot read anything from your Fitbit or Google account. That permission is kept on your phone and never reaches our servers; the ride goes from your phone straight to Google. Disconnect it in Settings and the app hands the permission back to Google, and the writing stops. The connection belongs to the phone rather than to your account: deleting your account leaves it in place until you disconnect it, and it is removed when a different account signs in on that phone. We receive nothing from your Google or Fitbit account, so we store none of it. Rides already added stay in your Fitbit account, where you can delete them in the Fitbit app.
Plan for 120's use and transfer of information received from Google APIs will adhere to the Google API Services User Data Policy, including the Limited Use requirements. The use of information received from Google Health API and/or Developer Tools will adhere to the Google Health API Developer and User Data Policy, including the Limited Use requirements.
Who handles it for us
Supabase hosts the database and the accounts, in the United States (Oregon). Amazon Web Services sends the codes that confirm an account and reset a password, in the United States (Ohio), and keeps any address that could not be delivered to, or whose owner marked a code as spam, on a list of addresses it will not mail again. If you are in the EU or the UK, your data goes to both under the Standard Contractual Clauses, and the UK's addendum to them, in their data processing terms. Apple delivers the updates a locked ride's lock screen needs, and Cloudflare hosts this website and passes on mail sent to support@planfor120.com. Each of them handles your data only to provide its service to us, under terms that protect it at least as well as this policy does. Supabase and Cloudflare see the IP address and device type of each request, as any server does, and keep them in their logs for a short time, to run the service and keep it secure. Mail you write to us arrives in our Gmail inbox, and we answer from it, so Google handles your email address, and anything you write to us, under its own privacy policy — as Apple does for payments, and Google for a Fitbit connection.
Payments
Subscriptions are sold and charged by Apple. Your card details go to Apple and never touch this app or our servers. When you subscribe, the app gives Apple your account's id — a random code that means nothing outside our database — so that Apple's record of the purchase can find your account. What we receive is that record: which plan, and when it renews or expires, sent to our server by Apple or passed on by the app exactly as Apple signed it.
What we do not do
No analytics or crash-reporting SDK. No advertising and no ad identifiers — the app does not ask for the advertising identifier and would have nothing to do with it. No tracking across apps or websites, and no data brokers. No selling or sharing your data under any definition, including the CCPA's. No location — the app never asks for it, and distance is estimated from the effort you rode because the bike does not move. No cookies on this website, and no analytics or tracking scripts on it either. Browsers' Do Not Track signals change nothing here, because there is nothing to track.
Why we may use it
If you are in the EU, the UK or anywhere with a similar law: we store your account, settings, rides and workouts to provide the account you asked for, which is performance of a contract. We store your heart rate on your explicit consent, given by ticking the setting above. And we keep the install date and the Apple Account identifier for our legitimate interest in giving the free days once per person rather than once per install or per email address.
How long it is kept
For as long as your account exists, with two exceptions: your heart rate goes when you untick the setting, as Health data describes, and a locked ride's lock-screen rows go within an hour. Delete the account and everything above goes with it — the rides, the settings, the workouts, the referral records and the feedback — except the Apple Account identifier and its date, described above, which keep no link to the account that was deleted. The rides on your phone stay there.
Your choices and your rights
Do not sign in, and nothing reaches us at all. Sign out, and your rides stay on the phone while syncing stops. Delete your account in the app, under Settings → Account → Delete account, or by emailing support@planfor120.com from the address the account uses. Ask for a copy of your data, to correct it, or to stop us using it, at the same address; we answer within 30 days. Revoke Health access in iOS Settings, Health Connect access in Android's Health Connect settings, and Fitbit access in the app's own Settings.
If you are in the EU or UK you have the rights of access, rectification, erasure, restriction, portability and objection under the GDPR, and the right to withdraw consent at any time. You may complain to your national data protection authority. We give the same rights to everyone, wherever they live.
Adults only
Plan for 120 is for people aged 18 and over, and we do not knowingly collect anything from anyone younger. If you believe someone under 18 has created an account, write to us and we will delete it.
Changes
When this policy changes, the date at the top changes. If a change affects what we collect or how we use it, the app will say so before it applies to you — and anything that needs your consent will ask for it again.