Your training stays on your device. Last Set has no account, no backend and no sync: the exercise library, every session, every set, your bodyweight log and every preference live in a single database on your phone.
The only way any of that leaves your device is the CSV file you create yourself by tapping Export Data, and where it goes from there is your choice.
Two things do talk to a server, and both are described below: a small number of usage events, and the subscription check for Last Set Pro. The second one runs every time you open the app, whether or not you have ever bought anything — it is how the app knows whether Pro is active, and it has to ask before it can know. Neither carries anything from your training.
Usage events
Last Set sends a fixed list of twenty-four events, and no others. Examples: the app was opened, a workout was started or finished, the Progress tab was viewed, the Last Set Pro screen was opened. Each event exists because a specific line of code raises it at a specific moment.
Nothing is captured automatically. There is no screen tracking, no tap tracking, no navigation tracking, no session replay, no crash reporting and no network logging.
Every property an event can carry is a fixed word from a fixed list. There is no property anywhere that accepts free text or a number, which is what makes the exclusions below structural rather than a matter of care.
What the events never contain
Exercise names · exercise IDs · workout names · template names · template IDs · weights · repetitions · sets · training volume · bodyweight · notes · personal records · location · contacts · email address · Apple ID · advertising identifiers · health data · raw database rows · anything you have typed
Last Set never asks for App Tracking Transparency permission, never reads the IDFA or any other advertising identifier, and does no cross-app or cross-site tracking. There is no advertising in the app.
Who receives them
TelemetryDeck, a
privacy-focused analytics service. Events are sent as a single HTTPS request to
nom.telemetrydeck.com. That is the only network request Last Set
makes for analytics; the app has no server of its own and loads no remote images,
fonts or scripts.
What each request contains
Last Set does not use TelemetryDeck's own software library. The request is built by hand, and these are all of the fields in it:
- An app identifier — names Last Set to the service. The same for every install.
- The installation ID — described below.
- A session ID — random, created in memory when the app starts and never written to storage, so it is a different value every launch and cannot recognise a returning device.
- The event name, from the fixed list above.
- A client version string — a constant naming this code.
- The properties, present only for events that carry any, and only ever the fixed words in the table above.
The app sends no app version, no operating system version, no device model and no timestamp. There are no such fields in the request.
What the app cannot control is the connection itself. Like any request over the internet, it carries your IP address and the standard headers your device's networking layer attaches, and TelemetryDeck records when it arrived. Last Set does not send an IP address as data and never receives or stores one, but the request is necessarily seen by the servers that answer it. What TelemetryDeck retains, and for how long, is governed by their own policies.
The installation ID
Events are tagged with a random installation ID so that repeat use can be counted in aggregate — how many installations are active, and whether people come back. Without one, every installation looks identical and a question like "do people return the following week" has no answer at all.
- What it is. 16 random bytes from the operating system, written as 32 hexadecimal characters. Generated once and stored in the app's own local database alongside your other preferences.
- What it is derived from: nothing. Not your device, not your hardware, not an Apple ID, not an email address, not your name, not the date you installed the app, not a counter. There is no input to it at all, so it identifies nothing outside this app's own analytics and cannot be recognised by any other app or service.
- What it is used for. Grouping events by installation, so figures such as active installations and week-over-week retention can be calculated. That is its only purpose.
- What it is never joined to. Never sent alongside workout content, and never linked to an email address, a name, an account, a subscription or a payment. It is never used for advertising and never used for tracking across apps or websites.
- Deleting it. Deleting Last Set deletes its database and therefore the copy on your device, so reinstalling produces a new installation with a new ID and no link to the old one. It does not delete events already sent. Every event carried this ID to TelemetryDeck, where it stays under their retention — deleting the app stops any further events, it does not reach back for the ones already delivered.
On the word "anonymous". These events are unlinkable to you — nothing in them or beside them identifies a person. They are linkable to an installation, which is the point of the ID. The precise word for that is pseudonymous, and this page uses it rather than claiming more.
Turning it off
Settings → Your Data → Share anonymous usage data.
- Analytics are enabled by default. There is no consent pop-up at launch.
- Switching it off takes effect immediately — the next event is not sent.
- Nothing is queued while it is off. Events raised while analytics are disabled are discarded where they are raised; there is no buffer anywhere in the app, so turning analytics back on cannot send anything from the period it was off.
- The choice is stored on your device and survives restarts and updates. It is not synced anywhere, because nothing is.
The full list of events
| Event | Sent when | Carries |
|---|---|---|
app_opened | the app becomes the foreground app | nothing |
workout_started | a workout is actually created | whether it came from a saved workout or was started empty, and that it is a strength session |
workout_completed | a workout is successfully finished | the same two |
progress_viewed | the Progress tab is opened | nothing |
exercise_detail_viewed | an exercise's detail screen is opened | nothing — not which exercise |
template_started | a workout is started from a saved workout | nothing |
free_limit_reached | the free plan refuses to save something, or a Pro chart is tapped | which of the three limits |
analytics_setting_changed | you switch analytics on | the new value |
workout_complete_viewed | the Workout Complete screen opens | nothing |
share_card_selected | you move to a different share-card design | which of the two designs |
share_workout_tapped | you press Share Workout | the same one |
native_share_sheet_opened | the system share sheet is handed the image | nothing |
native_share_completed | that sheet closes without an error | nothing |
native_share_cancelled | the share ends in an error instead | nothing |
paywall_viewed | the Last Set Pro screen opens | which screen sent you there |
plan_selected | you choose a different plan on it | annual, monthly, lifetime or other |
paywall_view_all_plans | you expand the other plans | nothing |
purchase_started | you press the purchase button | the same plan word |
purchase_cancelled | you back out of the store's own sheet | the same plan word |
purchase_succeeded | the store confirms a purchase | the same plan word |
purchase_failed | the store refuses one | the same plan word |
restore_started | you press Restore Purchases | nothing |
restore_succeeded | a restore brings Last Set Pro back | nothing |
restore_failed | a restore errors or finds nothing | nothing |
Two of these promise more in their names than any platform delivers. The system
tells Last Set when the share sheet closes, not what you did with it — so
native_share_completed means the sheet closed without an error, and
it is not a record of whether you posted, messaged or saved anything. The app has
no way to know that, and the image itself never passes through it.
Purchases
Last Set Pro is optional, but the check for it is not conditional. Last Set uses RevenueCat to tell it whether a subscription is active, and it asks on every launch, for every user, before you have bought anything and whether or not you ever do. There is no way for the app to know your subscription status without asking, and it needs the answer before it draws the first screen.
So on the first launch of a new install, RevenueCat creates an anonymous record for that installation, and the app contacts it each time you open Last Set — to read that record, to fetch the current plans and prices for your region, and to ask whether the store still considers you eligible for a free trial. None of those requests carries anything from your training.
- The payment is the platform's. Apple or Google takes the money. Last Set never sees a card number, a billing address or your store account, and there is no field anywhere in the app that could receive one.
- What RevenueCat receives. An anonymous identifier it generates itself for this installation; your purchase and receipt data from the store if you have any; and standard technical details — platform, operating system and app version, its own library version, your locale and your store's country. Its servers also see the connection, including your IP address, which is how a storefront and currency get resolved. It receives nothing from your training: no exercise names, no workouts, no sets, no weights, no bodyweight, no notes. There is no code path from your training database to it.
- No advertising or attribution identifiers. RevenueCat's software is capable of collecting device advertising identifiers and linking to attribution services. Last Set does not turn any of that on — the calls that would do it appear nowhere in the app's code.
- The purchase is anonymous, and it is not joined to your usage events. Last Set creates no account and does not identify you to RevenueCat, which generates its own random identifier. The installation ID used for analytics is deliberately never reused as that identifier, so subscription records and usage events cannot be matched to one another by sharing a key.
The purchase events carry no purchase data. Not the price, not the currency, not the amount, not the product, not the trial length, not the receipt and not the transaction — only which kind of plan and which screen you came from.
Because there is no account, restoring a purchase on a new device works through your store account. That is what Restore Purchases does, on the Last Set Pro screen and in Settings.
The app also keeps one row on your device recording whether Last Set Pro was active the last time it checked, so you are not locked out while offline. It holds a status word and a timestamp, nothing else, and it never leaves the device.
Everything else the app touches
- Local notifications — used only for the rest timer, and only after you have seen one running. Permission is asked at that moment, refusing costs nothing but the banner, and nothing about them leaves the device.
- Live Activities — the rest timer's Lock Screen and Dynamic Island countdown. Two timestamps cross to the system; nothing is transmitted.
- Export — writes a CSV file and opens the system share sheet. Where it goes from there is your choice; the app does not upload it.
Your data, and removing it
Because everything is on your device, there is no account to close and no server copy to request or erase. Deleting Last Set deletes its database — your training, your preferences and the installation ID — and there is no copy anywhere else and no way to recover it.
What has already been sent is a different matter, and deleting the app does not reach it. Usage events already delivered stay with TelemetryDeck, and the anonymous subscription record stays with RevenueCat, each under their own retention. Neither holds a name, an email address or an account, because Last Set never had one to give them — so there is no identity to look either up by. If you want to stop sending usage events, switch off Share anonymous usage data in Settings; that takes effect immediately. The subscription check cannot be switched off, because the app would have no way to know whether you are entitled to what you paid for.
Children
Last Set is not directed at children and does not knowingly collect information from them. It asks for no name, no email address, no date of birth and no account.
Changes to this policy
If what the app does changes, this page changes with it, and the date at the top changes too. Material changes will be reflected here before the behaviour ships.
Contact
Questions about this policy: lastset2026@gmail.com.