AI post-workout coaching report in Slack after every Strava ride or run

Get a personal coaching write-up in Slack within an hour of every ride or run, with pacing, heart rate, zones, weather context, and what to do next.

Agentic Task
StravaWeatherSlackPersonal ProductivityAI ReportsNotifications & Alerts

Build me an agent workflow that acts as my AI post-workout coach. After every ride or run I upload to Strava, I want a detailed coaching report sent to me as a Slack direct message within about an hour of finishing.

Trigger: cron, every hour. The trigger is a schedule because Strava is not in the platform's poll providers list, so the agent has to look for new activities itself on each run.

On each run, the agent should:

1. Use Strava's List Athlete Activities to fetch activities since the timestamp of the last successful run (use the previous run's start time as the `after` filter, and on the very first run look back 24 hours). For each new activity, skip it if the moving time is under 15 minutes, or if it was manually entered (no recording device, no streams). Process the rest in chronological order.

2. For each activity worth coaching, call Strava's Get Activity for the full detail object (distance, moving time, elapsed time, average and max heart rate, average and weighted-average power, average cadence, total elevation gain, sport type, start time, start latlng). Then call Get Activity Streams for the time-series streams (heartrate, watts, cadence, velocity_smooth, altitude, latlng, time) so you can see pacing and aerobic drift across the workout. Then call Get Activity Zones for the heart rate and power zone distribution.

3. If the activity has a start latlng, call the Weather integration's Get Current Weather for those coordinates so the report can frame the effort against temperature, humidity, and wind. If there's no outdoor location (trainer ride, treadmill), skip the weather call.

4. Write a coaching report in plain language that covers: execution quality versus the apparent goal of the workout, pacing across the session (negative, even, positive split, surges), aerobic drift (heart rate creep at constant pace or power), zone balance (was time spent where it should be for this kind of session), weather adjustment (call out heat, cold, or wind that justifies a slower pace), and two or three specific recommendations for the next session. Keep the tone like a smart coach, not a hype machine. No emoji spam.

5. Send the report to me as a Slack direct message using Slack's Send a Message operation. Format using Slack mrkdwn (single asterisks for bold, not double). Lead with one short summary line so the notification preview is useful, then the full breakdown. One Slack message per activity.

State to track across runs: the start time of the most recent activity that was successfully reported on, so the next run can filter to activities after that. Also de-duplicate by activity id in case List Athlete Activities returns an overlapping window.

Integrations: Strava (read activity scope, including private activities), Weather (platform credential), and Slack (user OAuth, chat:write and im:write so the agent can DM me as me). If a Strava API call returns 429, back off and retry on the next hourly run rather than burning the rate limit budget.

Additional information

What does this prompt do?
  • Watches your Strava account for new rides and runs every hour, and writes up each one on its own.
  • Pulls the detailed effort: pacing, heart rate, power, cadence, route, and how time was split across your zones.
  • Adds the weather at the start of the activity so hot, cold, or windy days are read in context, not penalized as bad pacing.
  • Sends you a coaching report in Slack covering execution, aerobic drift, zone balance, and two or three specific things to try in your next session.
  • Skips short warmups and manually entered activities so you only get a report when there is something real to coach.
What do I need to use this?
  • A Strava account with the activities you want analyzed.
  • A Slack workspace where the coaching reports can be sent to you as a direct message.
How can I customize it?
  • Change how often it checks, for example every 30 minutes if you want a report sooner after you finish, or twice a day if hourly feels like too much.
  • Adjust the minimum activity length, the default skips anything under 15 minutes so easy warmups and dog walks don't trigger a coaching write-up.
  • Tell the coach what to focus on, for example marathon pacing, threshold work, base-building heart rate discipline, or recovery quality, and the recommendations will shift to match.
  • Send the report to a private Slack channel instead of a direct message if you want a training log you can scroll back through.

Frequently asked questions

How soon after I finish a ride or run will I get the report?
The workflow checks for new activities every hour by default, so you'll usually have a report within an hour of uploading. You can tighten that to every 15 or 30 minutes if you want it faster.
Will it analyze indoor workouts too?
Yes. Trainer rides, treadmill runs, and indoor sessions all get analyzed as long as they came in from a device with heart rate or power data. The weather section is just skipped when there's no outdoor location.
Does it work for running, cycling, or both?
Both. The coach reads each activity's sport type and tailors the write-up, so you get pace and cadence framing for runs, and power and normalized effort framing for rides.
What about manually entered activities?
Manual entries are skipped on purpose. Without recorded heart rate, power, or GPS there isn't enough signal to coach against, so the workflow ignores them and waits for the next real recording.
Can I send the report somewhere other than a Slack DM?
Yes. Point it at any Slack channel you're in, including a private training-log channel just for you, and the coaching report will post there instead of as a direct message.

Turn every workout into a coaching conversation.

Connect Strava and Slack once, and Geni writes up every ride and run for you with what went well and what to try next.