Cookie Policy
The short version
We use a small number of cookies and browser storage keys. Most of them are there to keep you signed in and to make the app work offline — those we use without asking, because the service cannot run without them.
Almost everything else is optional. We ask before we store it, rejecting is one click and no harder than accepting, and if you reject everything the whole of SailCoach still works exactly as it did. Nothing we store is used for advertising, and we do not sell it.
The exception is error reporting, which runs whatever you choose. It stores nothing on your device, but it does send data about you to a third party, so we have given it its own section below rather than leaving it inside a category you can switch off.
This policy is published by Innovology Ltd, trading as SailCoach. If you want the bigger picture of what we do with personal data, read the Privacy Policy. If you are under 18, there is a plain version written for you: Privacy for Young Sailors.
What we mean by "cookies"
The law here — regulation 6 of the Privacy and Electronic Communications Regulations 2003 (PECR) — covers more than cookies. It covers anything we store on your device or read back from it. So this policy covers four kinds of thing:
- Cookies — small files your browser sends back to a server on every request.
- Local storage — values saved in your browser that stay until something deletes them.
- Session storage — the same, but wiped when you close the tab.
- Cache storage — copies of pages and files kept by the app's service worker so it still opens when you have no signal on the water.
Where we say "storage" below, we mean all four.
Cookies and storage we use without asking
PECR reg. 6(4) lets us store something without consent when it is strictly necessary to provide the service you asked for. That exemption is narrow and we have kept it narrow. These are the only items we treat as exempt.
| Name | Type | Who sets it | What it is for | How long it lasts |
|---|---|---|---|---|
__Secure-better-auth.session_token (called better-auth.session_token outside production) | Cookie, set on api.sailcoach.app, HttpOnly, Secure, SameSite=None, partitioned | SailCoach | Keeps you signed in. Without it every page would ask for your password again. | 7 days, renewed while you keep using the app. Deleted when you sign out. |
better-auth.state, better-auth.pkce_code_verifier | Cookies, set on api.sailcoach.app | SailCoach — only if you sign in with Google | Security checks (CSRF protection and PKCE) that stop someone else hijacking the round trip to Google and back. | Minutes. Deleted as soon as sign-in finishes. |
sailcoach.actingFor | Session storage | SailCoach | When a parent switches into managing their child's account, this records which child. It holds that child's name and account ID. | Until you close the tab. |
pwa-install-dismissed | Session storage | SailCoach | Remembers that you dismissed the "install this app" prompt, so it does not nag you again. | Until you close the tab. |
theme | Local storage | SailCoach | Light or dark appearance on the main site. | Until you clear it. |
sailing-theme | Local storage | SailCoach | Day or night appearance on the on-the-water screens. | Until you clear it. |
admin-theme | Local storage on admin.sailcoach.app | SailCoach | Light or dark appearance in the admin console. | Until you clear it. |
sailcoach-v1 | Cache storage (service worker) | SailCoach | Offline copies of pages you have already opened, so the app still works with no signal on the water. See the note below — this one holds more than its name suggests. | Until you clear your browser's site data. |
sailcoach.consent.v1 | Local storage | SailCoach | Records which optional categories you accepted or rejected, so we do not ask on every visit. The version number is part of the key: if we add anything to the optional categories we raise it, which discards your old answer and asks you again. | Until you change your choice or clear your browser storage. |
Why light and dark mode is in that table
The three theme keys are there because you pressed a control that says "make this dark". Remembering the setting is the thing you asked for, not something extra we wanted to store, so we treat it as strictly necessary under PECR reg. 6(4)(b) and it is kept whatever you decide about the optional categories below. If you would rather it was not kept, clear it in your browser and the app will open light every time.
What the offline cache actually holds
The app shell — the home page, the offline page and the manifest — is stored when the service worker installs. After that, every page you open on sailcoach.app is kept, including signed-in pages: your dashboard, a session, a set of notes. That is what makes the app open on a boat park with no signal, and it is also why someone who can unlock your device can see pages you have already viewed. The cache never stores responses from our API, which is on a different host, and never stores anything from another site.
Two limitations. The cache name is fixed, so publishing a new version of the app does not replace or clear it. And nothing expires an entry. It lasts until you clear your browser's site data, or until you uninstall the app from your home screen. On a shared device, clearing site data after you sign out is worth doing.
Two things worth knowing about the session cookie
It is set on the API, not on the website. The cookie belongs to api.sailcoach.app. Your browser sends it there when the app makes a request. It is marked HttpOnly, so no JavaScript — ours or anyone else's — can read it. It is also marked SameSite=None and partitioned, because both the app and the admin console talk to that one API host.
One sign-in covers the whole platform. The main app at sailcoach.app and the admin console at admin.sailcoach.app both talk to that same API, so there is one session per browser for all of SailCoach. Signing in to the console replaces any session you had in the main app, and the other way round. Signing out of either signs you out of both. If you administer a club and also have a sailor account, use separate browser profiles.
Optional cookies and storage
Nothing in this section is stored until you tell us it is allowed. There are two categories.
Preferences
Small settings that remember how you like the app set up. Useful, but the app works without them.
| Name | Type | Who sets it | What it is for | How long it lasts |
|---|---|---|---|---|
sailcoach.activeSquadId | Local storage | SailCoach | The squad you were last looking at, so the picker opens where you left it. | Until you clear it. |
sailcoach.v2.home.mode | Local storage | SailCoach | Which layout you chose for your home screen. | Until you clear it. |
Those two keys are the whole category. If you decline preferences, we do not store them, the app opens with its defaults every time, and you can still change the setting for the visit you are in.
Analytics
Two things sit in this category: our own usage measurement, and Sentry's session replay. We have deliberately put them together, because both build a record of what you did on a page and neither is necessary to deliver the service.
| Name | Type | Who sets it | What it is for | How long it lasts |
|---|---|---|---|---|
sailcoach_anonymous_id | Local storage | SailCoach | A random identifier (it looks like anon_1758…) attached to every usage event, so a series of page views can be recognised as one visit and one returning browser. If you later create an account, we link that trail to your account. | Until you withdraw consent, sign out, or clear your browser storage. |
sentryReplaySession and the replay buffer | Session storage | Sentry (our error-monitoring provider), through code running in the page | Identifies one session replay recording — a reconstruction of what happened on screen, which we use to work out why something broke. | The tab session. Sentry closes a replay after 60 minutes, or after 15 minutes of inactivity. |
What the usage events actually contain, and what happens to them on our servers — including that we store your IP address and browser user-agent alongside them — is set out in the Privacy Policy. How long we keep them is in the Data Retention Schedule, which says which periods are enforced automatically and which are not.
Session replay is masked. Sentry records 10% of sessions at random, and 100% of sessions in which an error happens, and every replay has all text obscured and all media blocked before it leaves your browser — so a replay shows us layout and interaction, not the content of a coach's notes. The masking was turned on in the same release as this policy; before that, replays captured on-screen text.
Error reports, which are in no category at all
If a page breaks, a diagnostic report goes to Sentry whatever you choose above, and so does a performance trace for one page load in ten. We treat error and performance reporting as strictly necessary to keep the service working, so it is not behind consent and rejecting everything does not switch it off. It stores nothing on your device. It does send your email address, username and account ID to Sentry when you are signed in, so that we can tell whether a fault hit one person or everyone.
You can disagree with that judgement, and if you do, tell us at [email protected]. Session replay — the part that records the screen — is a different thing and is genuinely optional, which is why it sits in the analytics category above.
Sentry's traffic, both kinds, is sent through sailcoach.app/monitoring rather than straight to Sentry's own domain. That means a content blocker will not recognise and stop it. It is still data going to a third party, and Sentry is listed on our Subprocessors page.
Other sites your browser contacts
Some parts of the app load files directly from other organisations. That does not always involve a cookie, but it always tells the other organisation your IP address, your browser's user-agent, and which page you were on. That is a disclosure about you, so it belongs here.
| Who | Where it happens | What they receive | Cookies? |
|---|---|---|---|
| OpenStreetMap (OpenStreetMap Foundation) | Every map: venue maps, club maps, course maps, the live-session map in the admin console | Your IP address and user-agent, plus the map tile coordinates — which reveal roughly which venue or session you are looking at | No cookies |
| cdnjs (Cloudflare) | The pin images on those same maps | Your IP address and user-agent | No cookies |
| Cloudinary | The background video on our public home page only | Your IP address and user-agent | No cookies |
| YouTube (Google) | Only where a coach has embedded a YouTube video inside session content, such as a debrief | Your IP address, user-agent, and the video you are viewing | Not the usual ones. We use YouTube's no-cookie player (youtube-nocookie.com), so the embed sets no advertising cookies. Google may still store something on playback. We do not set it, cannot read it, and do not receive anything from it. |
The YouTube player loads as soon as you open a page that has a video on it, rather than waiting for you to press play. We are changing that to a placeholder you click, so Google is not contacted at all unless you want the video. Until then, that row describes what happens on page open.
A venue's location links out to google.com/maps with its coordinates in the address. That is a link you choose to follow, and Google's terms govern it from the moment you do.
Our own emails are plain HTML, but the templates pull a web font from Google Fonts. If your mail app loads remote content, Google sees your IP address at that moment. You can stop this by turning off remote image loading in your mail app.
We do not embed advertising, social sharing widgets, tag managers, or chat widgets anywhere. Our fonts on the website are served by us, not by Google.
How we ask, and how to change your mind
The first time you arrive we show a consent banner with three choices, presented with equal weight:
- Accept all — turns on preferences and analytics.
- Reject all — turns both off. One click, the same size button, the same prominence.
- Choose — lets you accept preferences and analytics separately.
Nothing in the optional categories is written to your device before you answer. Closing or ignoring the banner counts as a refusal, not as agreement.
You can change your answer whenever you like, using the panel below. The same two categories appear, set to whatever you last chose. Withdrawing consent is as easy as giving it, as UK GDPR Art. 7(3) requires.
Your current choice
You have not been asked yet. Nothing optional is stored on your device.
When you withdraw consent we stop collecting immediately and delete the keys that category had stored in your browser. Signing out clears the analytics identifier too, so the next person on a shared laptop does not inherit your trail.
Session replay is the one part we cannot stop instantly. A recorder already running on the page you are on cannot be detached mid-page, so withdrawal stops new recording from your next page load; Sentry's own session key clears when you close the tab.
Usage events we had already collected are handled under the Privacy Policy and the Data Retention Schedule; if you want those deleted too, ask us at [email protected] and see Your Data Rights.
If you say no
Everything still works. We mean that literally, and it is worth being specific about what you do and do not lose.
You keep: signing in, every training and coaching feature, sessions, notes, race analysis, squads, parent access, media uploads, offline use, and every page on the public site.
You lose: nothing you can see, except that the app forgets layout choices — such as which squad you had open — between visits if you also declined preferences. Light and dark mode is remembered either way: that one is a control you pressed asking us to change the display, so it is part of the service you requested rather than something extra we wanted to store.
We lose: the ability to count how a feature is used, and the ability to watch a replay of the exact sequence that broke something. That makes our job slower. It does not make your experience worse.
There is no paywall, no nag screen, and no reduced version of SailCoach for people who decline. Consent that is not freely given is not consent.
Browser controls and Global Privacy Control
You can control storage in your browser, independently of us:
- Block or delete cookies for a site, or for all sites, in your browser's privacy settings.
- Block third-party cookies. This does not affect your sign-in, because our session cookie is a first-party cookie for the API it is sent to. It will not stop the embedded YouTube player loading, and it is not needed to stop YouTube's advertising cookies — the no-cookie player already does that.
- Clear site data, which removes every item in this policy, including your consent choice and the offline cache. You will be signed out and asked about cookies again.
- Use private or incognito browsing, which discards everything when you close the window.
Instructions differ by browser; look for "Cookies and site data" in the settings of Chrome, Safari, Firefox or Edge.
Global Privacy Control (GPC) is a signal some browsers and extensions send to say "do not sell or share my data". We honour it. If your browser sends GPC we treat it as a refusal of both optional categories, and we do not show you the banner at all — asking again after you have already answered at the browser level would be the kind of nagging the signal exists to stop.
We also do not use browser fingerprinting, device fingerprinting, or any other technique designed to recognise you without storing something you can delete.
Children
SailCoach is used by children, so the ICO's Age Appropriate Design Code applies to us. Two consequences for this page:
- The optional categories are off by default for everyone. A young sailor who taps "Reject all" gets exactly what they asked for, with no follow-up prompt trying to change their mind.
- We do not profile children for marketing, we do not use cookies to build interest profiles, and we do not share anything from this page with advertisers. There are none.
There is a third point, and it is a gap rather than a reassurance. The UK sets the age of digital consent at 13, in section 9 of the Data Protection Act 2018, so a younger child's tap on "Accept all" is not valid consent. We do not act on that today. We cannot know the age of a visitor who has not signed in, and for a signed-in sailor we do know is under 13 we do not currently override their answer or ask a parent instead. Everything optional still starts off and stays off until somebody actively says yes, which limits the harm, but it does not fix it. Building the under-13 override is on the list below.
More on how we design for under-18s is in Our Approach to the Children's Code.
Housekeeping we have already done
Two keys you may find in an older browser profile are no longer in use. sailcoach_boat_class is deleted automatically the next time you load the app. userId and userRole are read by one old screen but nothing has written them for a long time; they are harmless and you can clear them. Neither is set by the current app.
Known gaps
Three items on this page are not yet where they should be.
- YouTube embeds load without being asked. The player is the no-cookie one, so no advertising cookies are set, but it still contacts Google as soon as you open a page with a video on it. We are replacing it with a placeholder you click.
- The offline cache is never cleared for you. It keeps signed-in pages, a new release does not replace it, and nothing expires an entry. Clearing your browser's site data is the only way to empty it today.
- A child under 13 can answer the banner for themselves, as described above.
Changes to this policy
Every version of this document stays published at a fixed version number, so you can compare what we said then with what we say now. If we add anything to the optional categories, we will ask for your consent again before it is used — an existing consent does not roll forward to a new purpose.
Contact
Questions about anything on this page: [email protected]. General contact: [email protected].
If you are not happy with our answer you can complain to us at [email protected] (see Complaints), and you can complain to the Information Commissioner's Office at ico.org.uk/make-a-complaint or by calling 0303 123 1113. Complaining to us first is not a precondition.
Innovology Ltd is registered in England and Wales and is the data controller for the storage described here.