Privacy

Last updated November 12, 2026

Written in plain English on purpose. This is a small product run by one person; if something here is unclear, ask and we will fix the wording.

What we store

When you arrive through a tagged marketing link, we keep its source, medium, campaign, ad, and ad-set labels in a first-party cookie for up to 30 days. If you sign up, we keep those labels with your account to understand which ads bring new trainers. Email sign-in can carry the labels through Supabase so they survive opening the link on another device. Signup notifications to our team include these labels. We do not use them for access decisions.

When you complete signup, we also keep the approximate country provided by our host, Vercel, with your account and include it in signup notifications to our team. This helps us understand where signups and paying customers come from. We store the country code for this purpose, not your IP address. VPNs and other network routing can affect the estimate.

If you download the free session tracker from its page, we ask for an email first. We store that address, which file you took, when, and the ad labels already described above, so we can email you about session tracking. That address is not sent to Meta or Google. Write to support@packsleft.com to be taken off that list.

For you: your email, display name, timezone, policy text, weekly booking hours, a usual meeting place, and billing status. We also store the Stripe customer id for your subscription ($14.99/mo or $149.99/yr), and your Stripe Connect account id once you connect, so client pack payments can land in your account. If you connect Google Calendar, we store an encrypted token so we can add and remove session events and read busy times. Disconnect deletes that token.

If you leave the check-in emails on, we store whether you unsubscribed, whether you opted into the newsletter, and a pause date if you asked us to wait.

For your clients: whatever you type in — name, and optionally email, phone and notes — plus their packs, sessions, payments, and booked times. A booked time can carry a place the client sees on their link. A person who uses your unlisted booking link types their own name and a phone or email. We do not email clients.

Google Calendar

Connecting Google Calendar is optional. If you connect it, PacksLeft requests three permissions only: create and change events on the calendar you choose, see whether that calendar is busy, and read the email address of that Google account.

We use them to keep bookings in step with that calendar. Booking a session adds one event titled “Session · [client]” with the start, the end, and the place. Moving the time updates that same event. Cancelling deletes it. A class adds one event for that date, titled with the class name, not one event per student, and the event does not list who is booked. We do not read, edit, or delete events we did not create. Busy or free time is used only to hide hours that are already taken. We do not store the titles of your other events. The Google email address is shown on Booking settings so you can see which account is connected.

Security procedures are in place to protect that data. Traffic between your browser, PacksLeft, and Google is encrypted in transit (HTTPS). The refresh token Google issues is encrypted before it is stored, with AES-256-GCM, and the key stays on our server. The browser is not given a key that can read it. We do not send the token in email or put it in the page.

We do not sell Google user data. We do not transfer or disclose it for advertising. We do not use it to train AI or machine learning models. The only companies that handle it are the ones that run PacksLeft: Supabase stores the encrypted token and the connected email address, and Vercel hosts the app. Google keeps the events on your own calendar.

We keep the token only while Calendar stays connected. Disconnect deletes our copy and revokes the token with Google, so PacksLeft can no longer act on that account. If you ask us to delete your account, we delete the token then too. Write to support@packsleft.com.

Calendar feed

Settings can give you a private calendar address. If you subscribe to it in Apple Calendar, Google Calendar, or Outlook, that company fetches your sessions from it: the client’s name in the title, the start, the end, and the place. It carries no email, phone, notes, or counts. Regenerate the address in Settings and the old one stops working.

How you sign in

Sign-in is a magic link, Google, or Apple. There is no password. Supabase sends the link, or Google or Apple confirms the account you pick, and Supabase keeps the session in a cookie. The key the browser is allowed to hold cannot read your ledger. Only our server can. If that account uses an email you already signed in with, it is the same account. If you hide your email from Apple, Apple gives us a private relay address, and that address is the account.

What your clients see

A client’s link shows only that client’s sessions remaining, their last five sessions, a booked time and the place when one is set, your policy text, and buy buttons for priced packs you mark Show on portal, with the Venmo or card options you have set up. It never shows their email, phone, your notes, or any other client. A class link shows that class’s upcoming times and how many spots are open, plus a form for a name and a phone or email. It does not show who else is booked. We do not email them. They drop a spot from a cancel link, which asks before it cancels. From that same client link they can add their booked times to their own calendar. That calendar lists only their times and the place. It is not your Google Calendar. The link is unguessable and you can rotate it at any time, which immediately kills the old one, including that calendar. These pages are not indexed by search engines.

Email

We email you. We do not email your clients.

Pack alerts (running low, or expiring) come from alerts@. Optional welcome and check-in mail comes from hello@, and you can turn that off. Unsubscribing uses the one-click control in the email. Opening the link in a browser goes to preferences instead, so a mail scanner that fetches every link cannot unsubscribe you. Turning off check-ins does not turn off pack alerts.

Alert emails say your client was not emailed.

Card payments

There are two Stripe relationships, and they are not the same money.

Your clients pay into your own Stripe account. Card numbers never touch PacksLeft’s servers — we only store which pack was bought and that it was paid. PacksLeft takes 0% of those charges. Stripe’s own fees still apply.

Your subscription ($14.99/mo or $149.99/yr) is a separate charge on PacksLeft’s Stripe account.

What we measure

If you are in the EU, the EEA, the United Kingdom, or Switzerland, or if we cannot tell the country, the advertising and analytics tools in this section do not load until you accept. Cookie settings, in the footer and on this page, stores that choice in this browser for 180 days and can change it later. Elsewhere those tools load as described here, unless you reject them in Cookie settings.

We use HeyCatch to measure page visits, navigation, clicks, and first-time account milestones. After sign-in, we link this activity to your trainer account id, email, display name when set, plan, billing status, and signup date. Signing out clears the browser identity. HeyCatch does not receive your clients’ names, contact details, notes, or private link tokens. Autocaptured text and element attributes are masked, client ids in page paths are replaced with a general label, and URL queries and fragments are removed. Events from private client, booking, payment, authentication callback, and email preference links are excluded. HeyCatch session replay is disabled.

We record seven first-time events about your account only: sign-up, first client, first log, Stripe connected, first checkout, first time a client opens their link, and trial converted. A portal open is recorded as you, never as your client. No client information is sent to analytics. Session replay runs only on the public site for visitors who are not signed in (see Microsoft Clarity below), never inside the trainer app and never on a client’s link.

To diagnose problems, we record sign-in failure categories and browser errors on signed-in trainer pages in our Vercel hosting logs. Browser reports contain an error category, a general page name such as settings or client detail, and fixed labels for the error type and whether its script came from the app, a third party, or a browser extension, when available. They do not include source URLs, error messages, stacks, client IDs, email addresses, or private link tokens. Browser error collection stays off public pages, client links, booking links, payment links, and email preference pages.

The public site and the trainer app load the Meta pixel, so we can see whether an ad led to a trial or to a download of the free session tracker. It records a page view, one event when a trial starts, and one event when that sheet is downloaded. It does not load on a client’s private link, a booking link, or a payment short link. Those addresses are the credential, and they are not sent to Meta. We do not send your clients’ names or their emails.

Each browser gets a random id, stored on the device, so one visitor can be told from another. After you sign in, events from this browser also include a hash of your email. The hash is not the address. Signing out removes it. The download event for the free sheet carries the browser id only, unless you are signed in, in which case it includes the same email hash. The address you type to download the sheet stays on our server. It is not part of that event.

The public site (the homepage, the sign-in page, and the articles) also loads an OpenAI measurement pixel so we can see whether a ChatGPT ad led to a trial. It records which page was opened and, when a trial starts, that the trial started. It may store two cookies in this browser, named __oppref and __obref, to tie that visit to the ad. If you type your email on the sign-in page, the pixel may include a hashed copy so the trial can be matched to the ad. When a trial starts, our server sends that same event: a hash of your email, a hash of your account id, this browser’s IP address and user agent, and those two cookies when this browser has them. The email address and the account id themselves are not sent. No client name or client email is included. Inside the app the pixel loads once, on the first screen after a new account is created, which has no clients on it yet. It does not load on a client link or a booking link.

The same Google tag that measures ads can also send page views to Google Analytics, when a measurement id is configured. A new account sends one sign_up event from the first screen after signup. If no measurement id is set, Analytics is not loaded. It stays off a client’s private link, a booking link, and a payment short link. That event does not include a client name or a client email.

The public site uses Microsoft Clarity to see how visitors use it: heatmaps and recordings of clicks, scrolling and page movement. It loads only for visitors who are not signed in, and only on public pages (the homepage and the articles). It does not load on the sign-in page, inside the trainer app, on a client’s private link, a booking link, or a payment short link, so it never sees a client’s name, phone, email or session count. Clarity masks typed text and may set cookies to recognise a returning visitor. Microsoft’s privacy statement: privacy.microsoft.com.

Who else handles data

Vercel hosts the app. Supabase holds the database and sign-in. Stripe processes cards. Resend sends email. If you choose Continue with Google, Google confirms that account’s email address. If you choose Continue with Apple, Apple confirms the email you share, or a private relay address if you hide it. Either address is your account email. Welcome mail, check-ins, and pack alerts go to it. We do not email your clients. Google Calendar holds session events only if you connect it. Meta receives the events described above, from the public site and the trainer app only, including the browser id and, after you sign in, the email hash. OpenAI receives the ad-measurement events described above. Google receives the ads tag, and Analytics page views when a measurement id is set. Microsoft receives Clarity recordings when that tool is allowed to load. HeyCatch receives the masked product analytics described above when it is allowed to load. We do not sell your data.

On this browser

The client portal may store one flag in this browser so the “save this link” nudge stays dismissed. That flag stays on the device. It is not an account. When ad measurement is allowed, the public site and the trainer app may also store the random id described above. That id stays on the device. Your accept or reject choice is stored in a cookie and in this browser’s local storage.

Your data is yours

Export your clients, packs, sessions and payments as CSV from Settings at any time, including after your subscription ends. Ask us to delete your account and we will remove your data.

People in the EU, EEA, UK, and Switzerland

The data controller is Scott Foster, PacksLeft, PacksLeft, 6417 Penn Ave S, Ste 7-262, Minneapolis, MN 55423. Email support@packsleft.com.

Running your account, the ledger, sign-in, subscription billing, and the pack alerts you configure is processing we do to perform the contract with you. Keeping the service reliable, and recording sign-in failures and signed-in browser errors so we can fix them, is our legitimate interest. You can object to processing that relies on legitimate interest. Check-in mail relies on that same legitimate interest, helping a new account get set up, and it stops when you unsubscribe. The newsletter is sent only if you opt in, which is consent. For visitors in these places, and when we cannot tell the country, Google Ads, Google Analytics, the Meta pixel (including a hash of your email after you sign in), Microsoft Clarity, the OpenAI ad pixel, and HeyCatch run only after you accept. That is consent. Withdrawing it does not close the account.

You can ask for access to the personal data we hold about you, a correction, deletion, or a portable copy of what you gave us. You can object to processing based on legitimate interest, withdraw cookie consent, and complain to the supervisory authority where you live. Email support@packsleft.com to use these rights.

We keep the account, clients, packs, sessions, and payments for as long as the account exists. After a subscription ends, the ledger stays readable and export still works until you ask us to delete the account. We do not delete that data on a timer. The marketing-link cookie lasts up to 30 days. Sign-in attempt counters are removed after a day. A Google Calendar token is deleted when you disconnect Calendar or when the account is deleted. A client photo is deleted when that client is removed. The cookie choice stays in this browser for 180 days.

PacksLeft is operated in the United States. The companies named under “Who else handles data” process personal data there, including when you are in the EU, the EEA, the UK, or Switzerland.

To stop those advertising and analytics tools in this browser, open Cookie settings and choose Reject.

Contact

Questions or a deletion request: support@packsleft.com.