My 6 Month Whoop Check-up
Last Christmas, my wife got me a Whoop 5.0 fitness tracker. She knew I was super interested in the sleep tracking aspect and that I would prefer something low maintenance (and screenless). Whoop has been perfect in that regard. I charge it once every 2 weeks and I can leave it on my wrist 24/7. Beyond insights into my sleep hygiene, I've learned a ton about how my body responds to different stressors.
Now that I've had the device for 6 months, it seems like a good time to export my data and see if I can find anything that Whoop's UI isn't telling me. Unfortunately, I found that Whoop's bulk data export was incorrect on days with naps. Check my GitHub to see how I re-generated the CSV data from their Developer API instead.
Strain, Recovery, and Sleep Performance
Whoop generates three proprietary scoring calculations:
- Strain (0-21) measures cardiovascular load for the day
- Recovery (0-100%) is a daily readiness score built from RHR, HRV, and respiratory rate
- Sleep Performance (0-100%) tells you how well you slept relative to your sleep needs
The chart below shows each curve as a 7-day rolling average plotted on a shared axis. Recovery and Sleep Performance read directly off the left, while Strain is rescaled and labeled on the right. Click a pill to isolate a pillar and see my raw daily scores behind each curve.
The daily Strain score is largely a composition of one's activities. The main activities in my dataset are basketball, weightlifting, manual labor, and functional fitness. For each day, I found the highest strain activity and plotted it against the next morning's Recovery score. If there were no activities, it's considered a rest day. Click a pill to isolate by activity.
Maximizing Basketball Recovery
When I turned 35, I began to accept that I only had a few years of decent basketball left in me. Since then, I've made some lifestyle tweaks: I cut back on alcohol, I got back into weightlifting, and I added plyometrics to my training days. My goals have shifted from "become more explosive" to "don't lose what explosiveness you have left". Since basketball is my highest Strain activity, it also has the biggest impact on my recovery. I want to find the ideal heart-rate-zone mix within a session that will minimize the impact to tomorrow's Recovery score.
Since Whoop doesn't publish their scoring formulas, I'll need to create two models to feed into this optimization engine:
- Strain: reverse-engineered from each workout's heart-rate-zone minutes
- Next-day recovery cost: a function of that day's zone-minutes measured against a trailing 7-day personal baseline
My Strain model's R² =
What's interesting about the next-day recovery model is that time in HR zone 1 correlates with a slight increase in recovery (+
If I try to find the optimal workout using this model, it will just say "stay in zone 1 forever". So instead, I'm forcing it to use real zone data (bound to the 10th-90th percentile range) from my 71 actual basketball workouts. The optimizer can only choose among realistic basketball intensity levels, not swap the activity out entirely. Here's the result.
In practice, that reads as easing into the workout a little slower and backing off a little earlier. That seems like a smart move considering most injuries I've sustained in the past few years occurred deep into hooping runs. Strain would drop from
Conclusion
My Whoop 5.0 tracker has already told me a great deal about my sleep, recovery, and workout performance. I had no idea my heart rate was still going over 200bpm during an intense game, or that my RHR can drop into the 30s on a cool night. Being able to export and drill down into the data on my own is just a bonus. I'd recommend the device to anyone who is serious about their physical longevity.
Still, a $200 subscription per year is steep. While there's an open-source effort to unlock the Whoop for non-subscribers, I'll likely continue with the paid version because it complements my life and goals. If they would expose the raw sensor data as well, I'd probably be a lifer.
Disclosure: graph components were built with AI coding assistance