Wrist-worn biosensors do not measure estrogen. They do not measure progesterone. What they do measure is skin temperature, heart rate, heart rate variability, and movement. The question we have been working on since we started Clair Health is whether those indirect signals, assembled correctly and reasoned over the right time horizons, can tell you something reliable about where in the menstrual cycle a person currently is.
The short answer is yes, with caveats that matter. This post is a technical walk-through of how we approach the problem: what architecture we chose, why, and which calibration decisions have the most impact on real-world prediction quality.
Why indirect inference is hard
The signals we collect are downstream of hormones by at least two biological steps. Estrogen influences thermoregulation via vascular tone, which produces a measurable skin temperature effect. Progesterone has a well-documented thermogenic effect that shows up as the basal body temperature (BBT) shift after ovulation. LH surge timing affects HRV through autonomic tone. But every one of those relationships is noisy: activity, sleep quality, ambient temperature, stress, and hydration all modulate the same signal channels.
The consequence is that a single feature read in isolation is almost useless. Skin temperature going up could mean you are in the luteal phase, or it could mean you just finished a run, or it could mean the room is warmer today. The only way to separate the hormonal signal from the confounders is to look at patterns across multiple channels, over extended windows, relative to each person's own baseline.
Model architecture: multi-channel LSTM with personalization layer
Our current inference model is a multi-channel LSTM. The input sequence is 21 days of windowed biosensor data: one row per hour, four feature columns (skin temperature, resting HR, RMSSD-based HRV, and a movement intensity proxy). We use 21 days because that window is long enough to capture the follicular plateau and luteal rise without requiring a complete cycle to initialize inference.
The LSTM processes the sequence and outputs a probability distribution over four coarse phase states: menstrual, follicular, periovulatory (the five-day window bracketing the LH surge), and luteal. We intentionally use coarse states rather than day-level predictions for two reasons. First, the underlying signal resolution does not support day-level accuracy reliably. Second, most clinical and personal use cases care about the phase bracket, not the exact cycle day.
On top of the shared LSTM weights, we add a personalization layer: a per-user scaling function that adjusts the temperature feature's effective contribution based on that user's observed inter-cycle range. Some people show a 0.3 degree Celsius luteal shift; others show 0.9 degrees. Without this adjustment, the model defaults to something close to a population average, which works acceptably but misses meaningful individual variation.
Training data and the label quality problem
The most important thing we can say about training data for this class of model: the label matters more than the signal volume. A dataset with 5,000 cycles but imprecise cycle-phase labels (self-reported period start with no ovulation confirmation) will underperform a dataset with 800 cycles where ovulation is confirmed by LH urine strip and the luteal shift is verified against serum progesterone draw on day 7 post-ovulation.
In our internal pilot dataset, we used confirmed LH-strip ovulation timing combined with wearable data from participants who also completed salivary estradiol sampling at three time points per cycle. That combination gave us a phase label that is physiologically anchored, not self-reported. The tradeoff is cost and participant burden, so scale is limited. We are not at the point where we have tens of thousands of fully confirmed cycles; the model generalizes from a much smaller base and continues to personalize as it accumulates more of your own data.
We want to be direct about what that means: the preliminary accuracy figures we see in held-out evaluation are promising for a phase-indicator tool, but this is not a clinical diagnostic. We are not saying the model diagnoses cycle disorders or determines fertility status with clinical precision. It surfaces a data-grounded picture of your pattern that is more informative than self-reported period tracking alone.
Calibration decisions that move prediction quality the most
Three calibration choices dominate outcomes in practice.
Circadian detrending. Skin temperature has a strong 24-hour rhythm that must be removed before the model can see the slower hormonal signal underneath. We fit a per-user circadian baseline using 14 days of non-luteal data and subtract it from the temperature feature. The specific approach matters: using a population circadian template instead of a person-specific one inflates error on users who run unusually warm or cool relative to average.
Sleep segmentation for HRV features. HRV computed from all-day data is dominated by activity artifacts. What predicts cycle phase is resting HRV, specifically the overnight value between roughly 2 AM and 5 AM when autonomic tone is most stable and activity interference is minimal. Devices that report a daily HRV aggregate without segmenting sleep quality out are giving us a noisier signal. We apply a sleep-segment filter and weight overnight windows more heavily when constructing the daily HRV feature.
Handling gaps from device removal. Most wearable users take their device off to charge, shower, or sleep on nights when the band feels uncomfortable. A two-hour gap in the middle of a night is not random: it shifts the effective sample in ways that can look like signal. We use a gap-aware LSTM variant that learns to down-weight prediction confidence for sequences with substantial removal-pattern gaps rather than treating imputed values as observed. The confidence interval output reflects this: a day with 14 hours of wear gets a wider CI than a day with 22 hours.
What the output actually is
The model does not return a single predicted phase. It returns a probability vector over the four states plus a calibrated confidence interval for the most likely state. A typical high-confidence output looks like: follicular 0.81, periovulatory 0.12, luteal 0.06, menstrual 0.01, with a confidence interval of plus or minus 1.4 cycle days on the phase transition boundary. A low-confidence output might show follicular 0.51, periovulatory 0.34 on days when the signals are ambiguous.
We display both to users and to clinic integrations. A wide CI is not a failure; it is correct information that says the signals were ambiguous today. Forcing a single predicted state when the evidence is mixed would be more misleading than showing the uncertainty directly. A common instinct in product design is to hide uncertainty to avoid confusing users, but in this application, hiding it would mean presenting false confidence about something that has real downstream consequences for how someone plans their week or how a clinician interprets a visit.
Where we are and what we are working on
The current model performs well in our internal pilot dataset across participants with regular cycles. It performs meaningfully less well on cycles with anovulation, PCOS-pattern signals, and perimenopause-range variability. Those populations are not edge cases; they are a significant share of the people who most want continuous cycle monitoring. That is the primary model challenge we are working on now.
The architecture changes we are testing include a longer input window (42 days) to capture the multi-cycle baseline needed for PCOS-pattern inference, and a mixed-effects modeling layer that allows the personalization component to share statistical strength across users with similar biosensor response profiles rather than fitting fully independently per user.
We are also working on integrating a sparse ovulation-confirmation signal from optional LH strip tests that users can log manually. That gives us a high-quality anchor point a few times per year to recalibrate the phase boundary estimates, rather than relying entirely on the passive wearable stream. Not every user will do this, but for those who do, it meaningfully tightens the CI on phase transition predictions.
Building hormone inference from wrist data is a tractable problem. It is not a solved one. We are sharing this architecture overview because the core modeling choices are ones that practitioners in the adjacent field of physiological time-series analysis will recognize, and we want to be clear about what we have validated and what we are still improving.