Skip to content
TrailMath
Build my plan Dashboard Build my plan Dashboard
Legal

Privacy Policy

Last updated: 6 November 2026

1. Who We Are

TrailMath is a trail running training planning tool operated by SC EXPRESS DESIGN SRL (CUI RO19127375), Brașov, Romania (data controller within the meaning of the EU General Data Protection Regulation, "GDPR").

Contact: support@trailmath.run

2. Scope

This Privacy Policy applies to personal data processed through the TrailMath web application at app.trailmath.run, the TrailMath mobile applications, and the marketing site at trailmath.run.

You must be at least 16 years old to use TrailMath. We do not knowingly collect data from anyone under 16. If we become aware that a user is under 16, we will delete their account and associated data promptly.

By creating an account you agree to our Terms of Use. When you connect third-party platforms (Strava, Garmin, Suunto), their own privacy policies also apply – see Section 6.

TrailMath supports guest accounts – you may begin using the app without providing an email address. Guest accounts store the same training and profile data described below, associated with a device-generated identifier. If you later register with an email, your guest data is linked to the new account.

3. Data We Collect

3.1 Account Data

Email address and password (hashed with bcrypt) when you create a registered account. Guest users are identified by a device-generated identifier and do not provide an email or password until they choose to register.

3.2 Profile and Onboarding Data

Running experience level, weekly volume, training preferences, race objectives (including target race name, date, distance, elevation, and priority), and scheduling preferences (preferred training days, available days per week) – provided during onboarding or updated later in account settings.

3.3 Training Data

Training plans, scheduled sessions, completion status, session notes, actual vs. planned metrics (distance, duration, pace, elevation), and session-level data such as warmup/cooldown structure, interval targets, and RPE (Rate of Perceived Exertion) values that you record within the app.

3.4 Health and Injury Data

If you use the injury tracking feature, we collect: injury location, type, severity, pain level, date of onset, and any notes you provide. This data may include information that qualifies as health data under GDPR Article 9. We process this data on the basis of your explicit consent (Art. 9(2)(a) GDPR), which you provide by voluntarily entering injury information in the app. You can delete individual injury records at any time.

Cycle tracking (optional). If you turn on cycle-aware training, we collect what you choose to log: how regular your cycle is, the start date of your last period, your typical cycle and period lengths, and, on completed sessions, your cycle phase, period flow and energy. This is health data under GDPR Article 9, and we process it only on the basis of your explicit consent (Art. 9(2)(a) GDPR), which you give by ticking an unticked box in the app. We use it to show an estimate of your period on your training week and, when your own logs show a harder day, to offer an easier option for your next hard session, which you choose whether to accept. It is never used to rebuild your plan. Cycle data is not sent to the TrailMath Assistant or to any AI provider, is never shared with the Course Assistant on our race pages, and is never used for analytics. You can stop at any time in Settings; stopping deletes your cycle profile and every cycle entry on your sessions. We keep a record of when you gave and withdrew consent, which is deleted with your account.

3.5 Strength Training Data

If your plan includes strength sessions, we collect: exercises performed, sets, repetitions, weight, rest periods, and exercise completion status.

3.7 Connected Platform Data

When you connect Strava, Garmin or Suunto (see Section 6), we receive activity data including: activity type, name, date, duration, distance, elevation gain, heart rate summaries (average, max), and sport type. From Suunto we receive workout summaries only: no GPS track and no activity file.

We also temporarily store the raw API response from each platform, which may contain additional metadata beyond the fields listed above (such as gear, splits, laps, or GPS summaries from Strava and Garmin; for Suunto, the workout summary record as Suunto sends it). Imported activity records, including raw responses, are automatically deleted after 7 days. Training metrics derived from matched activities (duration, distance, elevation) are stored as part of your training history.

3.8 Push Notification and Device Data

If you enable push notifications on your mobile device, we store a device token (provided by Firebase Cloud Messaging) associated with your account. This token is used solely to deliver notifications you have opted into. You can disable push notifications at any time through your device settings, which effectively prevents further notifications. Device tokens are deleted when you disable notifications or delete your account.

3.9 Technical Data

IP address, browser type, device information, and request logs collected automatically.

Legal basis Legitimate interest (Art. 6(1)(f) GDPR) – security monitoring, abuse prevention, and debugging

3.10 Usage and Analytics Data

If – and only if – you turn on product analytics in the mobile app, we collect usage events describing how you move through the app: screens viewed, workouts completed, training blocks started and finished, and app open and session events. These events carry coarse device and country information and a pseudonymous app instance identifier linked to your account identifier. They never contain your name, email address, GPS tracks, health or injury data, or free text you have written. See Section 7.3 for the full description, including how to withdraw.

This category covers the mobile app only. Analytics on the marketing site at trailmath.run is a separate matter, described in Section 10.1.

Legal basis Consent (Art. 6(1)(a) GDPR) – off by default, collected only if you opt in

3.11 Newsletter Consent Record

If you subscribe to the newsletter (see Section 4.8), we keep a record of that consent: your email address, the date and time, the IP address and browser user agent the request came from, which page or screen you subscribed from, your language, and the version of the wording you agreed to.

An IP address is personal data, so we are telling you plainly that we store one here. We keep it for a single purpose: the GDPR requires us to be able to demonstrate that a person actually consented (Art. 7(1)), and an unsubscribe request or a complaint can arrive long after the fact. It is never used to locate you, to profile you, or for any other purpose.

If you later unsubscribe, we keep that evidence for a limited period and then strip the IP address and user agent from it - see Section 11. If you never registered an account, you can still see and delete everything we hold about your subscription; Section 13 explains how.

Legal basis Consent (Art. 6(1)(a) GDPR) – recorded as evidence of that consent

3.12 Course Assistant Questions From Our Race Pages

On some race pages you can type a question for the TrailMath Assistant before you have an account. When you continue, we send the text of your question, the race and your language to our app, which holds it for 30 minutes so it can appear in the assistant once your plan is ready. It is then deleted, whether or not it was used. The link you follow carries only a random reference to it, never the question itself, and the question is not sent to our analytics or written to our logs. Your IP address is used, without being stored with the question, to stop the form being abused.

Please leave health or medical details out of this question. It exists to carry a question about the race into the app, not to collect anything about your body - if you have an injury, the TrailMath Assistant in the app has a dedicated, confirmed way to record it.

Legal basis Steps taken at your request before you create an account (Art. 6(1)(b) GDPR)

If you have Premium and are signed in, a race page can also show a chat with the Course Assistant about that race. That chat is part of the TrailMath Assistant in your account: your messages and the replies are stored with your account, deleted automatically after 90 days (see Section 11), included in your data export, and deleted with your account. The chat is shown from our app inside the race page; signing in happens on our app's own page.

To answer how you would fit a particular race, that chat reads a limited part of your training: your sex and runner background, your estimated pace and the effort zones derived from it, an overview of your current plan and which phase you are in, how closely you have followed the last four weeks, and your goal race and its date. It is assembled on our servers and sent to the third-party AI provider that generates the assistant's reply; only that reply is shown inside the race page.

It does not receive your injury or pain records, your menstrual cycle data, your heart-rate thresholds, anything you have written in free text on a session, or identifiers for individual sessions. It is read-only: it cannot change your plan, your sessions or your settings. You are asked to accept the terms for this chat separately from the TrailMath Assistant in the app, because the two see different things.

3.13 Weather Alerts

On a race's course page and in the GPX Explorer you can ask us to email you when the weather forecast for a race or a route opens. You can also ask for a race alert from Claude or ChatGPT, which you then confirm by email (see Section 3.18). There are two kinds, and each is its own request: neither signs you up for the newsletter, and the newsletter does not sign you up for either.

For both, we also keep your language and, as evidence of your consent, the date and time, the IP address and browser user agent the request came from, and the version of the wording you agreed to - for the same reason as in 3.11. All of it is deleted with the alert (see Section 11).

Legal basis Consent (Art. 6(1)(a) GDPR)

3.14 Race Results

If you asked us for a finish-time estimate for a race before race day, the app may ask you afterwards how the race went. If you answer, we keep which race and edition it was, whether you finished, did not finish, did not start or did not take part, your finish time if you finished, where that time came from (the official result, your watch or Strava, or not sure) and whether you ran a different course. Answering is optional: you can skip the question, ask us not to ask again, and delete an answer at any time in Settings > Privacy & data.

If you have agreed to it, we may also record your official result ourselves from the race's public results page. In that case we also keep the address of that page and a short note of when you agreed. We never take a result from Strava or any other activity platform.

Legal basis Consent (Art. 6(1)(a) GDPR)

3.15 Race Time Predictor on trailmath.run

From 1 November 2026, when you use the Race Time Predictor on trailmath.run we record each estimate it gives you, to measure how well our estimates hold up and to improve them. We record the race you chose (or the distance and climb you typed, to 0.1 km and 10 m), the numbers you entered about yourself - a UTMB or ITRA index and which of the two it is, and a past race with its year and finish time (to the minute) - the estimate and range we showed you, how each of your inputs contributed to it, whether you accepted or skipped our suggestion to add another input, the language of the page, and the day (not the time) of your visit.

We do not record your name, your email, your account, your IP address, your browser, or any cookie, and we never store anything that came from Strava: if you import a run from Strava, we only note that one of your inputs came from there. Your visit is grouped under a random number that exists only while the page is open, so we can see the order in which you added inputs. Because a stated index together with a past race and its time could still single someone out, we treat these records as personal data, keep them for a limited time (see Section 11) and only ever read them in aggregate.

Legal basis Legitimate interest (Art. 6(1)(f) GDPR) - checking and improving the accuracy of our estimates

3.16 Race History and Performance Index (App)

From 3 November 2026, you can add to your account your UTMB or ITRA performance index (which of the two it is, and the date it was valid on) and past races you have run: the race (from our catalogue, or a name you type), its distance, climb and descent, the year, your finish time and, if you want to, how the race went (to plan, a bad day, or all out). You type these yourself in Settings > Race history & index; when the app offers to add a race you entered as a goal, it fills in the course and you type the time. Nothing here is taken from Strava or any other activity platform. Adding them is optional: you can edit or delete them at any time.

Legal basis Contract performance (Art. 6(1)(b) GDPR) - you add them to get finish-time estimates based on your results

3.17 Start Alerts (App)

On "My race" in the app you can ask us to email you when it is time to start preparing a race you estimated. It is its own request, made with a box you tick yourself: it does not sign you up for the newsletter or for a weather alert. We keep your account, its email address, which race it is and the race's date and start (from the race's published edition, not from you), the date the email is due, and your language. As evidence of your consent we also keep the date and time, the IP address and user agent the request came from, and the version of the wording you agreed to - for the same reason as in 3.11. All of it is deleted with the alert (see Section 11).

Legal basis Consent (Art. 6(1)(a) GDPR)

3.18 AI Assistant Connectors (Claude and ChatGPT)

You can add TrailMath as a connector in Claude or ChatGPT (see our connector page). The assistant then calls our server at mcp.trailmath.run when it needs race facts, a finish-time estimate or a training sample. There is no TrailMath account on this path: we do not know who you are, and the records described here are pseudonymous - they carry no account, IP address or chat text. What reaches us is what the assistant sends for one request - a race or course, and for a training sample your race date, weekly training minutes, maximum hours, training days, running background, terrain you can train on, optional strength answers, your timezone and your language. Never your health, injuries or name, and your email only if you ask to sign up for our emails (below). We use it to answer that request; a training sample is kept in a cache for up to 10 minutes so the same answers on the same day give the same weeks. We store no IP address. Our servers keep container logs by size (up to 50 MB per container, usually under 7 days), with aggregate counts per tool every 15 minutes (calls, errors, average time).

Usage records. To understand how the connector is used and improve it, we keep one record per request that reaches our server: the time (to the minute), which assistant, which tool, whether it worked, your language, the race when TrailMath recognised it (for a search, the races it returned), why TrailMath had no answer when it had none, and the structured answers listed above, rounded so a record cannot be matched to a published result (finish times to 5 minutes, distances to 5 km, climbing to 100 m, a UTMB or ITRA index to the nearest 25, weekly minutes to 30; for a course not in our catalogue, only the month of the race). From 5 November 2026, we also keep the words of a race search only when it found no race, and the name of a race TrailMath did not recognise, so we can see which races people look for that we do not carry yet. These words are lowercased and cut to 80 characters, and email addresses, web links and numbers of five or more digits are removed; anything else in the search, such as a name, is kept as written, so please search only for races. We never record what you typed in the chat, the words of a search that found a race, your IP address or any account, and there is no session identifier, so separate requests cannot be linked together. We keep these records for 90 days, then delete them. Because they cannot be tied to a person, they are not included in data exports and we cannot find yours to delete on request (Art. 11 GDPR); you can still object to this processing (see Section 13).

Continuing in TrailMath (Claude only). If you ask Claude to continue in TrailMath, the answers above are saved and Claude gives you a sign-up link carrying a random code. We keep the saved answers for 30 days, then delete them. Nothing is added to an account until you sign up or log in and tap Import; the answers are then linked to your account, included in your data export, and deleted with your account. The sample and the import are meant for adults; TrailMath accounts are for people aged 16 and over (see our Terms).

Signing up for our emails from the chat. If you ask the assistant to sign you up for our newsletter or for a race's weather alerts, it sends us the email address you gave it, what you asked for (the newsletter, and the race for an alert), your language and which assistant you used. We store this as soon as it arrives, as a pending request, and email that address a link to confirm. Nothing starts from the chat: you are only signed up once you open that link and tick what you want on our page, and that click is your consent (Art. 6(1)(a) GDPR). If you do not confirm within 48 hours, the pending request is deleted; you can also ask us to delete it sooner (see Section 13). To stop the link being used to flood someone's inbox, we keep a count per address (a one-way fingerprint of it, not the address itself) of how many confirmation emails we sent, for up to 30 days. Once you confirm, Section 3.13 (weather alerts), Section 4.8 (newsletter) and Section 4.9 apply exactly as for a sign-up on our website. The usage record for that request never holds your email address.

Anthropic (Claude) and OpenAI (ChatGPT) run the conversation and decide what they send us and what they keep. For your chat they are independent controllers under their own privacy policies, as Strava, Garmin and Suunto are for your activities (see Section 8); they are not our processors, and we do not send them your TrailMath data.

Legal basis Legitimate interest (Art. 6(1)(f) GDPR) in answering requests the assistant sends and in understanding how the connector is used (usage records); for saved answers, steps at your request before entering into a contract (Art. 6(1)(b) GDPR)

4. How We Use Your Data

4.1 Core Service

Legal basis Contract performance (Art. 6(1)(b) GDPR)

4.2 Activity Matching

When activities arrive from Strava, Garmin or Suunto, we match them against your planned sessions to automatically track completion and calculate training load metrics.

Legal basis Contract performance (Art. 6(1)(b) GDPR)

4.3 Volume Estimation and Historical Import

When you connect Strava, we can import up to 90 days of historical activities. This backfill establishes your recent training volume baseline, which is used to generate safe and effective training plans - avoiding sudden load spikes that could lead to injury. When you connect Suunto, we import your workouts from the last 30 days once, then new workouts arrive as Suunto notifies us. We do not currently request past activities from Garmin: activities you record after connecting Garmin arrive automatically.

Legal basis Contract performance (Art. 6(1)(b) GDPR)

4.4 Workouts Sent to Your Watch

If you connect Garmin Connect and grant its Workout Import permission, TrailMath sends the structure of your upcoming planned workouts to your Garmin Connect calendar, from which your Garmin device receives them. If you connect Suunto, TrailMath sends your upcoming dated runs to your Suunto account as SuuntoPlus Guides, which reach your watch once you pin them in the Suunto app. Details of what is sent are described in Sections 6.3 and 6.4.

Legal basis Consent (Art. 6(1)(a) GDPR) – you actively initiate the connection

4.5 Push Notifications

If enabled, we send notifications about upcoming sessions, plan updates, or TrailMath Assistant messages. You can disable notifications at any time through your device settings.

Legal basis Consent (Art. 6(1)(a) GDPR)

4.6 Diagnostics

Legal basis Legitimate interest (Art. 6(1)(f) GDPR)

4.7 Product Analytics

We use this data for product improvement only. We do not use it for advertising, we do not build behavioural or advertising profiles from it, and we do not sell or rent it. It is collected in the mobile app only, and only if you opt in – see Section 7.3.

Legal basis Consent (Art. 6(1)(a) GDPR)

4.8 Newsletter

If you ask for it, we send an occasional newsletter with training ideas and product news - roughly twice a month. It is entirely optional and separate from the account emails in 4.1: you can use every part of TrailMath without it, and declining costs you nothing.

You can subscribe from our website, from the newsletter checkbox when you create an account, from Notifications in your account settings, or by asking Claude or ChatGPT and then confirming from the email we send you (see Section 3.18). That checkbox is never pre-ticked, and subscribing is never bundled into accepting our Terms. Subscribing sometimes carries an introductory discount on TrailMath Premium; the discount is the reason we ask, not a reason you must stay.

You can leave at any time, with one click from the unsubscribe link in every newsletter, or from Notifications in your account settings. Leaving the newsletter does not affect your account or the emails described in 4.1, and we do not ask why.

The newsletter is a different setting from the training emails in 4.1. Turning one off does not turn off the other, in either direction.

Legal basis Consent (Art. 6(1)(a) GDPR)

4.9 Weather Alerts

A weather alert (see Section 3.13) sends you two emails and no others: one a week before the start, when the forecast opens, and one two days before, when the hourly detail is in. Each links back to the forecast for your route or your race. For a race alert, each of the two emails also includes an offer for that race's roadbook (the Race Pass, at a discount) - nothing more is sent for it, and a route alert carries no offer. We use what you gave us only to send those two emails at the right time where the route or the race is. If the organiser moves a race's date, we move the two emails with it.

The emails are written in your account's language when the address belongs to a TrailMath account, and otherwise in the language of the page you signed up on.

Every alert email has its own unsubscribe link, which deletes that alert at once - its route and date included - and nothing else: it does not touch the newsletter or any other alert. Every alert email also links to a page where you can see, download and delete what we hold for that alert, without an account.

Legal basis Consent (Art. 6(1)(a) GDPR)

4.10 Checking Our Finish-Time Estimates

We use the finish-time estimate records described in Section 11 to know which races to ask you about and when to ask, once the race is over. We use your race result (see Section 3.14) only to measure how accurate our estimates are and to improve them, and only in aggregate: our analysis prints nothing for groups smaller than ten athletes, it never names you, and we never show you the estimate you were given next to your result. Your result is never used for advertising and never sent to an AI provider.

Legal basis Consent (Art. 6(1)(a) GDPR) for your result; legitimate interest (Art. 6(1)(f) GDPR) for using your estimate records to ask you

4.11 Finish-Time Estimates From Your Results

We use the index and past races you add (see Section 3.16) to calculate your finish-time estimates in the app - on Progress, your race pages, your Race Plan goal, the watch and the estimate you get after a Strava import - and we show you which of them each estimate rests on. They are part of the training context the TrailMath Assistant sees, so it can explain those estimates to you. When we record a finish-time estimate (see Section 11), we keep a copy of the inputs it was calculated from with it, so we can later check how accurate it was.

Legal basis Contract performance (Art. 6(1)(b) GDPR)

4.12 Start Alerts

A start alert (see Section 3.17) sends you one email and nothing else: a week before the preparation window for your race opens - the number of weeks a race of that length and climb needs, which can be a little longer when your current training volume is well below what the race asks for. It links to your race in the app so you can build your plan. We use what we keep only to send that email at the right time. If the race's date moves, the email moves with it. If you build a training plan before then, or a plan for that race already exists when the email is due, we delete the alert instead of sending it.

The email has its own unsubscribe link, which deletes the alert at once and nothing else, and a link to a page where you can see, download and delete what we hold for it. It is also included in your account's data export and deleted with your account.

Legal basis Consent (Art. 6(1)(a) GDPR)

4.13 Premium offers

If you create a TrailMath account and reach the page where Premium is offered without subscribing, we may email you an offer on TrailMath Premium - for example a discount code - and remind you of the plan you were building. We send at most one such email a month, and no more than three in total. We never send them to people who already have Premium.

We tell you this on the page where Premium is offered, with a box to refuse, or, if you never saw it there, once in the app with a button to refuse. We send offers only to people who were shown that notice, and never to anyone who refused. To use them we need only your name, your email address, your language and the race and answers you entered before reaching that page (see Section 11).

You can refuse at any time, free of charge: with the box or button when you see the notice, with one click from the "Stop Premium offers" link in every offer, or under Notifications in your account settings. Refusing stops offers only - your account, your training emails (4.1) and the newsletter (4.8) are unaffected, in both directions. This is your right to object to direct marketing (Art. 21(2) GDPR), and we do not ask why.

Legal basis Legitimate interests (Art. 6(1)(f) GDPR), with the right to object at collection and in every message (Art. 13(2) ePrivacy Directive; art. L.34-5 French Postal and Electronic Communications Code)

We do not sell your data, use it for advertising, or build advertising profiles. We send marketing email only to people who asked for our newsletter, and Premium offers only to account holders who were told about them and did not refuse (4.13). You can stop either in one click.

6. Connected Platforms

6.1 How Connections Work

Platform connections use the OAuth 2.0 authorization protocol. When you connect Strava, Garmin or Suunto, you are redirected to that platform's website where you grant TrailMath specific permissions. We never see or store your platform password.

OAuth access tokens and refresh tokens are stored with application-level AES-256-CBC encryption in our database. Tokens are used solely to communicate with the connected platform on your behalf.

6.2 Strava

Permissions requested

We request the read and activity:read_all scopes. The activity:read_all scope grants access to all activities including those you have marked as private on Strava. We request this broader scope because many trail runners mark training activities as private while still wanting them included in their training plan tracking. You can revoke this access at any time (see Section 6.6).

Only if you choose to, we also request the activity:write scope, for the activity description line described below. Strava asks you for it separately, and we do not request it unless you have agreed.

Data flow direction

Strava → TrailMath, plus one optional line in the other direction. If you turn on Add a line to matched Strava runs (you are asked once, and it is off unless you say yes), TrailMath adds a single line to the end of the description of a Strava run you link to a planned session - for example "Training plan · Week 6 · Run 2/4 · 640 / 800 m D+ · trailmath.run". The line never names your race, never changes your own title or text, is added at most once per session, is only added to runs linked from the moment you turn it on (never to older activities or imported history), and is never added to an activity visible only to you. Once written, the line is part of your Strava activity: turning the option off, disconnecting Strava or deleting your TrailMath account stops future lines but does not remove lines already written - you can edit or delete them on Strava like any other text. You can turn the option off at any time in Settings > Connected apps.

Data received

Activity type, name, date, duration, distance, elevation gain, heart rate summary, and the raw API response (which may include additional metadata such as gear, splits, or laps).

Retention of imported data

Imported activity records, including raw API responses, are retained for up to 7 days, then permanently deleted. Training metrics already written to matched sessions (duration, distance, elevation) remain as part of your training history. See Section 11 for the full retention overview.

Webhook verification

Strava delivers activity updates via webhooks. We verify inbound webhooks by matching the subscription_id against our registered subscription.

Historical import

At connection time, we import up to 90 days of past activities. After that, new activities are received via Strava's webhook event system in near-real-time.

GPX Explorer import

On trailmath.run, the GPX Explorer can open a run from Strava. Connecting there creates or signs you into a TrailMath account and uses the same Strava connection described above. When you choose a run, we read the GPS track of that one run only, on your request, and pass it to your browser to display. We do not store that track, and a Strava import is not offered for weather alerts.

Activity deletion

If you delete an activity on Strava, we receive a webhook notification and remove the corresponding imported record from TrailMath within 48 hours. Training metrics already recorded on your sessions (duration, distance, elevation) are retained as part of your training history.

Disconnection

When you disconnect Strava from TrailMath, we call the Strava deauthorization endpoint to revoke our access tokens, and delete all tokens and cached activity imports from our database. Training metrics already recorded on your sessions are retained as part of your training history. Description lines already added to your Strava activities stay on Strava, where you can edit or delete them.

6.3 Garmin

Permissions requested

On Garmin's consent screen you choose which permissions to grant: Activity Export (to receive your activities) and Workout Import (to send workouts to your device). You can change either later in Garmin Connect, and we follow the change. The OAuth flow uses PKCE (Proof Key for Code Exchange) for added security.

Data flow direction

Bidirectional. We receive activity data from Garmin and can send workout structures to your Garmin device.

Data received from Garmin

Activity type, name, date, duration, distance, elevation gain, heart rate summary, and the raw API response.

Retention of imported data

Imported activity records, including raw API responses, are retained for up to 7 days, then permanently deleted. Training metrics already written to matched sessions (duration, distance, elevation) remain as part of your training history. See Section 11 for the full retention overview.

Data sent to Garmin

When you choose to push a workout to your Garmin device, we send: workout name, date, duration, sport type, and structured steps (warmup, intervals, cooldown, effort-zone labels, exercise names, sets, and reps for strength workouts). No personal information, email address, or cross-platform data is included in outbound workout payloads.

Webhook verification

Garmin delivers activity updates via webhooks to a secret address known only to Garmin and TrailMath; requests to any other address are refused. Notifications that you removed TrailMath from Garmin Connect, or changed its permissions, are acted on immediately.

Disconnection

When you disconnect Garmin from TrailMath, or delete your TrailMath account, we revoke TrailMath's access at Garmin and delete all OAuth tokens from our database. You can also remove TrailMath directly from your Garmin Connect account settings; Garmin then tells us, and we delete the connection and the activities imported through it the same way. Workouts previously pushed to your device will remain on the device.

6.4 Suunto

Connection

You authorise TrailMath on Suunto's own website. Suunto does not offer separate permission choices: one connection lets us receive your workouts and send guides. We store your Suunto username, to recognise notifications about your account, and the encrypted OAuth tokens.

Data flow direction

Bidirectional. We receive workout summaries from Suunto and can send SuuntoPlus Guides to your Suunto account.

Data received from Suunto

Workout summaries only: activity type, name, start time, duration, distance, ascent, and average and maximum heart rate, plus the summary record as Suunto sends it, which may contain additional metadata. We do not request the GPS track or the activity file. When you connect, we import the workouts from the last 30 days once; after that, Suunto notifies us of each new workout and we fetch its summary. Heart rate received from Suunto is not passed to the AI Assistant.

Retention of imported data

Imported workout records are retained for up to 7 days, then permanently deleted. Training metrics already written to matched sessions (duration, distance, elevation) remain as part of your training history. The notifications Suunto sends us (your Suunto username and a workout identifier) are kept for 30 days. See Section 11.

Data sent to Suunto

For your upcoming dated runs, we send a SuuntoPlus Guide: the session name and date, a short description, the step texts with their effort-zone labels, and an identifier that refers to the session in TrailMath. Guides carry no heart-rate or pace targets and no personal information, email address or cross-platform data. A guide reaches your watch only once you pin it in the Suunto app. While your connection is active, a daily clean-up removes guides whose date has passed.

Notification verification

Suunto signs each notification it sends us, and we check the signature before acting on it. We keep only notifications about new workouts and discard every other type.

Disconnection

When you disconnect Suunto from TrailMath, or delete your TrailMath account, we delete the OAuth tokens and the workouts imported through the connection. Suunto does not offer a way for us to revoke our access on its side, so to remove TrailMath from your Suunto account as well, remove it from the connected partner services in the Suunto app. If you remove it there first, Suunto does not tell us: we find out the next time we try to use the connection, then mark it as revoked and remove Suunto references from your training history. Guides already sent stay in your Suunto account and on your watch until you remove them, or until the daily clean-up does while the connection is active.

6.5 Third-Party Privacy Policies

Strava, Garmin and Suunto are independent data controllers for data they hold about you. They are not sub-processors of TrailMath – you connect to them directly via OAuth, and their privacy practices are governed by their own policies:

6.6 Your Control

7. Mobile Apps and Push Notifications

TrailMath is available as a mobile application. The mobile app accesses the same account and data described in this policy.

7.1 Push Notifications

If you opt in to push notifications, we use Firebase Cloud Messaging (FCM) operated by Google to deliver them. When you enable notifications, your device provides a registration token which we store and associate with your account. This token is an opaque identifier – it does not contain personal information.

Notification messages are composed on our servers in the EU. To deliver them, we send Google's Firebase Cloud Messaging service only the device registration token (an opaque identifier) along with a brief, generic prompt (e.g., "You have a session today"). No detailed training data, personal identifiers, or message content beyond this brief prompt is transferred to Google.

You can disable push notifications at any time through your device's notification settings. When you disable notifications or delete your account, we delete the associated device tokens.

7.2 App Store Distribution

The mobile app is distributed through the Google Play Store and/or Apple App Store. These platforms may collect their own data (crash reports, install analytics) governed by their respective privacy policies. TrailMath does not control or receive this data.

Purchases made inside the mobile app are processed by Apple (App Store) or Google (Google Play) under their own terms: your payment details stay with them and never reach TrailMath. We use RevenueCat to read the receipt and tell us which subscription or pass your account holds. See Section 8.1.

7.3 Product Analytics (Mobile App)

The mobile app can report product analytics through Firebase Analytics (Google Analytics 4), operated by Google. We use it for one purpose: to understand how the app is used so that we can improve it. It is not used for advertising, it is not used to build profiles about you, and the data is never sold or rented.

Analytics is off by default. Nothing is collected unless you actively opt in on a first-run prompt, and collection stays disabled at the SDK level until you do. You can decline – the app works the same either way.

What is collected when you enable it: screens you view, workouts you complete, training blocks you start and finish, app open and session events, coarse device information (device model, operating system version, app version), your approximate country as derived from your IP address, and a pseudonymous app instance identifier that we link to your account identifier so events from the same account can be counted consistently. That identifier is pseudonymous rather than anonymous: on its own it does not identify you, but we can relate it back to your account.

What is never collected: your name, your email address, GPS tracks or any location data more precise than approximate country, health or injury data, and any free text you have written (session notes, injury descriptions, and similar).

Where it is processed: Firebase Analytics processes this data in the United States. Google participates in the EU-US Data Privacy Framework, which provides the safeguard for that transfer. See Section 9.

How to withdraw: open Settings → Product analytics in the app and turn the setting off. Withdrawal takes effect immediately – the app stops sending events at once – and it also resets the local analytics identifier, so that any later opt-in begins from a new one. Withdrawing does not affect the lawfulness of processing that already took place. If you want analytics data already held by Google to be deleted, email us at support@trailmath.run.

Product analytics runs in the mobile app only. It is not active when you use TrailMath in a web browser. Analytics on the marketing site is described separately in Section 10.1.

8. Sharing and Recipients

We do not sell your data. We do not share data with advertisers.

8.1 Sub-Processors

We use the following sub-processors to provide the service:

Sub-Processor Purpose Data Location
Hetzner Online GmbH Infrastructure hosting, database, backups Germany (EU)
Bunny Fonts (BunnyWay d.o.o.) Web font delivery EU
Brevo (Sendinblue SAS) Email delivery: account emails such as password resets and security alerts, replies to messages you send us through the contact form, the newsletter if you subscribe to it, the weather and start alerts you ask for, and Premium offers (4.13). France (EU)
Google LLC (Firebase Cloud Messaging) Push notification delivery (when enabled). Only device registration tokens (opaque IDs) are shared with Google for message routing; notification content is composed in the EU. EU/US
Google LLC (Firebase Analytics / Google Analytics 4) Product analytics in the mobile app (only if you opt in), aggregate traffic measurement on the marketing site, and, once enabled, purchase, trial and refund events sent from our server for visitors who accepted analytics cookies. Never used for advertising or profiling. See Section 7.3 and Section 10.1. EU/US
Stripe Payments Europe, Ltd. Payment processing for subscriptions and passes bought on the web. You enter your card details on Stripe's own checkout page; they never reach TrailMath. We receive the payment status, the amount and a customer reference linked to your account. Ireland (EU), with transfers to the US
RevenueCat, Inc. Subscription management for purchases made in the mobile app through the Apple App Store or Google Play. RevenueCat receives your TrailMath account identifier (never your name or email) and the store receipt, and tells us which subscription or pass is active, renewed, cancelled or refunded. US
MET Norway (Norwegian Meteorological Institute) Weather forecasts for the route conditions feature. When you set a start date for a course, we send the coordinates of up to 25 sampled points along that route, and their altitude, to MET Norway to retrieve a forecast. We do not send your name, your email address, or any identifier: the request carries locations and a time window and nothing else. Responses are cached on our servers for around half an hour so the same course is not requested repeatedly. Forecast data is published by MET Norway under CC BY 4.0. Norway (EEA)

8.2 Connected Third-Party Platforms

Strava, Garmin and Suunto are independent data controllers, not sub-processors. Data flows to and from these platforms are initiated by you through OAuth connections. See Section 6 for details.

8.3 Legal Requirements

We may disclose personal data if required by law, regulation, legal process, or governmental request.

9. International Transfers

All primary data is stored on Hetzner servers in Germany.

When you connect Strava or Garmin, data is transferred to and from services in the United States. These transfers occur on the basis of your explicit consent (Art. 49(1)(a) GDPR) – you actively initiate each connection knowing data will be transferred to the US.

When you connect Suunto, data passes between us and Suunto Oy. Suunto and its group companies process it as controllers under their own privacy policy, which covers their transfers outside the EEA.

Firebase Cloud Messaging (if push notifications are enabled) receives device registration tokens – opaque identifiers with no personal data – to route notifications. These tokens may be processed in the US. The notification content itself is a brief, generic prompt composed on our EU servers. Google participates in the EU-US Data Privacy Framework.

Analytics data is processed in the United States. If you turn on product analytics in the mobile app, the usage events described in Section 7.3 are processed by Google in the US. The same applies to the aggregate Google Analytics data collected on the marketing site (Section 10.1). Both transfers rely on Google's participation in the EU-US Data Privacy Framework. For the mobile app, the processing additionally rests on your consent, which you can withdraw at any time.

RevenueCat processes in-app purchase records in the US, and Stripe may transfer payment data to the US. Both rely on the EU-US Data Privacy Framework or Standard Contractual Clauses for those transfers.

We recommend checking whether each provider participates in the EU-US Data Privacy Framework or offers Standard Contractual Clauses for additional safeguards.

10. Cookies, Local Storage, and Device Storage

10.1 Cookies

Cookies are used on the web surfaces only – the marketing site at trailmath.run and the web application at app.trailmath.run. The mobile app does not use cookies at all; what it stores on your device is described in Section 10.3, and the analytics it can report is described in Section 7.3.

Three of the cookies below are essential: without them you cannot sign in, submit a form safely, or see the right navigation once signed in. The other two are analytics cookies set by Google Analytics 4, which we use to measure aggregate traffic to the marketing site – how many people visit, which pages they read, and roughly where they arrive from.

Cookie Category Purpose Duration
trailmath_session Essential Session authentication Session (expires on browser close or after configured lifetime)
XSRF-TOKEN Essential Cross-site request forgery protection Session
tm_signed_in Essential Tells trailmath.run you are signed in to the web app, so its header shows "Go to dashboard" instead of "Sign in". Contains no user identifier or secret - only a signed-in display hint - and is never used to grant access The length of your web app session; removed when you log out
_ga Analytics Google Analytics 4 – distinguishes visitors in order to produce aggregate traffic statistics 2 years
_ga_P5MQ620Q86 Analytics Google Analytics 4 – maintains session state for those same statistics 2 years

The two analytics cookies are off until you accept them. On your first visit we load Google Analytics with storage consent denied, so no _ga cookie is written and no analytics identifier is stored, and we show a banner asking for your choice. Refusing is a single click and takes exactly as much effort as accepting. If you refuse, the analytics cookies are never set.

You can change your mind at any time using the Cookie settings link in the footer of any page on trailmath.run. Withdrawing consent stops further collection; to have data already collected deleted, email us at the address in Section 1.

Purchase events linked to your account (once enabled). If you have accepted the analytics cookies and you then sign in to the web app at app.trailmath.run, we store the Google Analytics client identifier taken from your _ga cookie (a random number, not your name or email) on your TrailMath account. When this feature is switched on, our server uses it to send Google Analytics 4 the checkout, trial start, purchase and refund events of your subscription or pass, through Google's Measurement Protocol, so that a payment made with Stripe on the web, or through RevenueCat with the Apple App Store or Google Play in the app, is counted against the visit that led to it. Each event carries only that identifier, the event name, the plan or pass, the amount and currency, and a transaction reference - never your name, email address or training data - and Google's advertising features are switched off for it. If you sign in on the web without the cookie, because you refused or withdrew analytics consent or cleared your cookies, the stored identifier is deleted and no further events are sent for you. The legal basis is your consent to the analytics cookies (Art. 6(1)(a) GDPR).

On either surface we do not use tracking pixels, we do not use third-party advertising cookies, and we do not use cookies to build advertising profiles.

10.2 Local Storage (Browser)

We use browser localStorage to store your dark mode preference, your cookie consent choice, and which weather layers you last switched on in the route conditions tool (trailmath-cond-layers). All three are non-tracking, functional storage that stays on your device and is not sent to our servers.

10.3 Device Storage (Mobile)

The mobile app may store authentication tokens and user preferences in secure device storage (Keychain on iOS, Keystore on Android). This data remains on your device and is cleared when you log out or uninstall the app.

The app also stores your product analytics choice as a local preference, so that it is remembered between launches and you are not asked again. If you have turned product analytics on, the Firebase SDK additionally stores a local app instance identifier on the device. Turning product analytics off resets that identifier, and both items are removed when you uninstall the app. See Section 7.3.

11. Retention

Data Category Retention Period
Account and profile data Until account deletion
Training data (plans, sessions, notes, strength data) Until account deletion
Health and injury data Until you delete the record or delete your account
Cycle tracking data Until you stop cycle tracking or delete your account. The record of your consent is kept until account deletion.
Processed activity data (matched sessions) Until account deletion
Imported activity records (Strava/Garmin/Suunto) Retained for up to 7 days, then permanently deleted. Training metrics derived from matched activities are retained as part of your training history.
Suunto notifications (your Suunto username and a workout identifier) 30 days, then permanently deleted
Strava description line: your choice, and a record of which sessions received a line Your choice is kept until you change it or delete your account. The record holds only our session reference and an outcome, never Strava content: entries for lines written are kept as long as the session exists (so a session is never written twice), other entries are deleted after 90 days. Lines already written stay on Strava.
Finish-time estimate records Up to 400 days from the last time you asked for that estimate, then deleted automatically, or immediately if you delete your account. If you disconnect Strava, the estimated pace and finish range derived from your imported activities are erased at that point; the race and course you asked about remain until the retention period ends. The copy of your index and past races kept with an estimate is erased as soon as you delete that index or race.
Performance index and past races you add Until you edit or delete them, or delete your account
Race results Kept while the finish-time estimate record they are paired with exists (see the row above), then deleted automatically. Deleted at once if you delete the result in Settings or delete your account.
Race Time Predictor records (trailmath.run) Up to 400 days from the day of the visit, then deleted automatically. They are not linked to an account, so they cannot be exported or deleted on request: we cannot tell which records are yours.
OAuth tokens (connected platforms) Deleted immediately on disconnect
TrailMath Assistant conversation history 90 days, then deleted automatically, or earlier if you delete your account
Push notification device tokens Until you disable notifications or delete your account
Usage and analytics data (mobile app, only if you opt in) Retained by Google for the event-data retention period configured on our Google Analytics property, then deleted automatically. Withdrawing consent stops further collection and resets the local identifier; to have data already collected deleted, email us.
Google Analytics client identifier stored on your account (web, only if you accepted analytics cookies) Until you next sign in on the web without the _ga cookie (for example after withdrawing analytics consent), or until you delete your account. The purchase, trial and refund events sent with it are kept by Google for the event-data retention period configured on our Google Analytics property.
Newsletter subscription Until you unsubscribe. Unsubscribing is immediate; we keep a suppression record afterwards so that a later import cannot put you back on the list by accident.
Newsletter consent evidence (IP address, browser user agent) Kept while you are subscribed, and for 12 months after you unsubscribe, so we can answer a complaint about an email we sent. After that the IP address and user agent are erased and only the non-identifying fact that consent existed remains.
Answers entered while setting up a plan (race, course, training availability), before a plan is created Up to 60 days after your last change. If you reached the Premium page, up to 12 months from that visit, so we can prefill the plan if you come back. Answers tied to a purchase or to a plan you created are kept with your account. Health and injury answers are never kept here. Everything is deleted with your account.
Premium offers: the record of when you were told about them, your refusal, and the dates of offers we sent (4.13) Until account deletion
Copies of the emails we send you (the address, the email and its content), so we can check what was sent and fix problems 90 days, then deleted automatically, or earlier if you delete your account, erase your newsletter subscription or cancel a weather alert (for that alert's emails). Password reset and sign-up confirmation emails are recorded without their content.
A question typed on a race page (Course Assistant) 30 minutes, then deleted automatically, whether or not it was used
Course Assistant chat on a race page (Premium, signed in) 90 days, then deleted automatically, or earlier if you delete your account
Weather alerts: your email, the route or race, the date and start, and the consent evidence for them Until three days after the start, then deleted automatically, so the second email's link still works on the day. Deleted at once if you unsubscribe from either email or delete it from the alert's data page.
Start alerts: your account and email, the race, its date and start, when the email is due, and the consent evidence for them Until three days after the email is due, then deleted automatically. Deleted at once if you unsubscribe from the email, delete it from the alert's data page, build a training plan, or delete your account.
AI assistant connectors: training samples cached for an identical request Up to 10 minutes
AI assistant connectors: answers saved from Claude to continue in TrailMath 30 days, or until account deletion once imported
AI assistant connectors: usage records (one per request, rounded answers, no account or IP) 90 days
AI assistant connectors: email sign-ups waiting for confirmation (your email, what you asked for, language, assistant) Until you confirm, or 48 hours, then deleted automatically (checked every hour). The per-address count of confirmation emails sent: 30 days
Technical/security logs Retained for a limited period for debugging and security purposes

When you delete your account, active data (profile, training data, conversations, tokens, and connected platform data) is deleted immediately from our production database. Encrypted database backups are overwritten according to our backup rotation schedule.

12. Security

We employ the following technical measures to protect your data:

Data breach notification: In the event of a personal data breach that poses a risk to your rights and freedoms, we will notify the relevant supervisory authority within 72 hours (Art. 33 GDPR) and notify affected users without undue delay (Art. 34 GDPR) where the breach is likely to result in a high risk.

13. Your Rights

Under the GDPR, you have the right to:

Account deletion is available directly within the app under account settings. You can also request deletion by emailing us.

If you subscribed to the newsletter without creating an account, these rights still apply to you, and you do not need an account to use them. Every newsletter carries a link to your own preference page. From there you can unsubscribe, download a copy of everything we hold about your subscription, and delete it outright - no email to us, and no proof of identity beyond the link itself, which only you received.

The same goes for a weather alert. Every alert email carries an unsubscribe link and a link to that alert's own data page, where you can see, download and delete what we hold for it - without an account, and independently of the newsletter.

To exercise any of these rights, email support@trailmath.run. We will respond within 30 days. If we need an extension (up to 60 additional days for complex requests), we will inform you within the initial 30-day period.

Supervisory authority: If you believe we have not adequately addressed your concerns, you have the right to lodge a complaint with the Romanian National Supervisory Authority for Personal Data Processing (ANSPDCP).

14. Changes and Contact

Changes to This Policy

We may update this policy to reflect changes in our practices or legal requirements. For significant changes (new data categories, new sub-processors, changes to your rights), we will provide at least 14 days' advance notice via in-app notification or email before the changes take effect.

Minor clarifications or formatting changes may be made without advance notice. The "Last updated" date at the top of this page reflects the most recent revision.

Contact

For any questions about this privacy policy, your data, or to exercise your GDPR rights:

SC EXPRESS DESIGN SRL (CUI RO19127375)
Brașov, Romania
Email: support@trailmath.run