How we count calories
Wolkup doesn't have one formula for every workout. Walking, running, cycling, skating, indoor steps — each has its own physics, and I work through them in turn: I ride and run with the app myself, compare what it computed against what the watch says, what the published equations say and what the effort actually felt like, then tune the formulas and parameters for that specific activity. It's ongoing work, not a one-time setup at launch.
The latest pass was on calories, and it turned out to be the most substantial one. Here's what I found — which doubles as the answer to "why doesn't your number match Apple's".
It started when I finished a run, exported it to Apple Health, and found two entries for the same workout. One said 631 kcal. The other said 752. The second one was ours.
So we're not juggling abstract numbers, here's that workout in full — every figure in this text refers to it:
| Outdoor run, evening | 27 July, 19:43–20:25 |
| Duration | 42:04 |
| Distance | 5.12 km (our GPS track) |
| Average pace | 8:13 /km |
| Average heart rate | 164 bpm |
| Maximum heart rate | 179 bpm |
| Cadence | 154 spm |
An ordinary easy run: no intervals, no real hills. Now, what the different models said it cost.
Gross and active are not the same thing
The heart-rate formula we used (Keytel) returns gross expenditure: everything the body burned during those 42 minutes, including what it would have burned lying still. Apple — like every fitness app — reports active energy, the part above resting. Resting expenditure is computed from my weight, height, age and sex from the profile, and for me it works out at about 1.3 kcal per minute — so roughly 55 of those 752 kcal weren't "burned on the run", they were "burned by being alive for 42 minutes".
It sounds minor, but it's the hardest class of discrepancy to spot: the number doesn't look broken. It just looks slightly generous. The heart-rate path lived in that shape for about a month, adding a few extra percent to Health — and therefore to the Move ring: the field we were writing into means active energy specifically, and gross energy was going into it.
Fixed: we subtract resting expenditure (Mifflin-St Jeor, from weight, height, age and sex), and the export now carries two figures instead of one — active energy, plus resting energy separately. So "Total Kilocalories" in Fitness finally means what it says, rather than being a copy of Active.
Then I compared our own two models
This mattered more. We have two: with a watch, expenditure comes from heart rate; without one, from distance. On the same workout they disagreed by a factor of 1.7.
So the same person, running the same way, saw a fundamentally different number depending on whether they'd worn a watch. And the no-watch model is the one most people see — a watch is the minority case.
At that point I stopped caring about the gap with Apple. Apple is someone else's app; disagreeing with it is allowed. An app that contradicts itself has nothing to be trusted with.
What we anchored on: physics
The energy required to move a mass over a distance is bounded by mechanics. A high heart rate doesn't create metres. So the backbone is now work, not heart rate — and that calculation is different per activity, because their physics is different.
For walking and running I took the American College of Sports Medicine (ACSM) equations — the ones used in sports medicine and in the cardio machines at any gym. They're simple: expenditure depends on speed, on mass, and separately on whether you're going uphill or on the flat.
There was a pleasant surprise here. Expanded over a whole distance, those equations give almost exactly what we already had: about 1 kcal per kilogram of body weight per kilometre of running. So the calculation I set out to replace was nearly right — the cost of a kilometre really doesn't depend much on whether you ran it fast or slow.
What it was missing is the part that matters: it ignored climbing entirely. A flat 5 km walk and the same 5 km with eighty metres of ascent produced identical numbers. Climbing is counted separately now, and it adds a lot — lifting your own body weight is expensive.
On the run in the table above, the ACSM equations give about 450 kcal of active energy. Against the 752 we were showing, and Apple's 631.
Bikes and skates needed a different approach, and this is where the change is drastic. "Calories per kilometre" is a meaningless quantity on wheels: aerodynamic drag grows with the cube of speed, so 20 km/h and 30 km/h cost wildly different amounts. We now model power (rolling resistance, drag, climbing, mass) and convert work into calories through efficiency. In practice: 20 km in an hour used to score the same as 20 km in forty minutes. It's now roughly half — which is honest, because 20 km/h averages about 70 watts, i.e. a very easy ride.
So what is heart rate for
It stayed, but its role changed: heart rate no longer computes the number, it corrects it, within ±20%.
The reasoning: heart rate is the only thing that knows about heat, wind, dehydration, fatigue, a loaded backpack, sand underfoot. All of that genuinely costs extra energy, and mechanics can't see any of it. But the literature puts that premium at 5-15%, not the 55% the raw formula was producing. Heart rate also has two systematic biases no coefficient can fix: from roughly 150 bpm upward the formula starts overestimating, and heart rate itself drifts up 5-10 beats over a long effort at unchanged workload, simply because you're heating up and losing water.
So mechanics is the anchor and heart rate is the correction. A brutal day raises the number, an easy one lowers it, and neither can run away by half.
Here's how it all lands on that same run:
| Estimate | Active kcal |
|---|---|
| Our old distance calculation | ~395 |
| ACSM equations (the anchor now) | ~450 |
| What the app shows now | ~540 |
| Apple | 631 |
| Our old heart-rate calculation | 752 |
My heart rate on that run was high for the pace, so the correction went to its maximum: 450 plus 20% is 540. Not 752 — but not bare mechanics either. The heat that evening genuinely cost extra work; just not half again as much.
Why we don't tune our numbers to match Apple
Two things get conflated here. Apple Watch measures heart rate very well — studies put the error around 5%, which is exactly why we take heart rate from the watch and trust it. Calories, though, are the weakest of its metrics: a 2025 meta-analysis across 56 studies puts the Apple Watch's energy estimate at roughly 28% mean error, and no study got it below 20% in at least one test condition — and it errs towards overestimating.
So Apple's figure isn't a target to hit. It's another wrist-heart-rate estimate — and on my run it was the one sitting 40% above what textbook physiology gives for that pace.
For our core case — walking, running, cycling, where distance, time and gradient are known — physics constrains the answer far more tightly than an optical pulse does: the energy cost of a kilometre of running is known to within roughly ±10-15% between individuals. On a bike the advantage is starker still: a wrist physically cannot see power output, and we compute it.
I won't claim our numbers are more accurate: we haven't tested that on a group of people, so for now we have reasoning rather than measurements. But Apple does have a real advantage, and it isn't in the physics: their model is personalised to a specific wrist, and it covers what has no measurable external work at all — strength training, HIIT, machines. There, heart rate has no alternative and we're the weaker one. Our heart-rate formula also doesn't account for fitness yet; that's the next step.
As for the numbers themselves: ours are now often lower than Apple's, and almost always lower than ours were a month ago. I know that's not what someone wants to see in a fitness app. But an inflated figure isn't a gift, it's a broken instrument: you can't plan food around it and you can't compare two of your own workouts with it.
What this means for you
Walks barely moved. Flat running didn't change; hilly running went up. Cycling and skating dropped noticeably, especially at relaxed speeds. We did not recalculate past workouts: rewriting history after the fact seems worse to me than leaving a visible seam in it.
And here's what I'm promising not to do: show you four numbers at once. In the app, calories are one number. If it raises questions, this page is the answer.
What's next in this work
The heart-rate formula doesn't yet know how fit you are — and that matters: two people at 164 bpm burn different amounts. A trained heart moves more blood per beat, so at those same 164 beats more oxygen goes through it, and the expenditure is higher. Fitness can be estimated from resting heart rate, which we already pull from Health, so that's the next thing we'll add.
The cycling calculation currently assumes you're sitting like a road cyclist — low and narrow. On an upright city bike air resistance is higher, so there we underestimate; that needs a bike-type setting. And as with any model of this kind, accuracy for an individual is ±10-20% — nobody in this field does better than that, including the ones whose packaging suggests otherwise.
Which is why every workout now stores both underlying estimates — mechanical and heart-rate-based — separately from the final figure. That lets us check the formulas against real data instead of arguments, and turns "your calories are wrong" into a specific workout with specific numbers. The next passes through the activity types will build on that.
Source on Apple Watch accuracy: The accuracy of Apple Watch measurements: a living systematic review and meta-analysis, npj Digital Medicine, 2025.