Calorie Needs Calculator

Take control of your nutrition with this comprehensive calorie calculator. Using the Mifflin-St Jeor equation, calculate your Basal Metabolic Rate (BMR) and Total Daily Energy Expenditure (TDEE). Get personalized calorie targets for weight loss, maintenance, or muscle building, plus macronutrient breakdowns. Perfect for fitness coaches, nutrition websites, gym apps, and health-focused businesses helping clients achieve their goals.

Health & FitnessPopular

Try the Calculator

Calorie Needs Calculator
👤 Personal Information
 
 
📏 Body Measurements
 
 
 
🏃 Activity Level
Multiplier: 1.55 - Regular gym sessions or sports 3-5x/week
🎯 Your Goal
 

🔥 Your Calorie Needs
$ 1,768.00
cal
$ 2,740.00
cal
🎯 Target Calories
$ 2,740.00
cal/day
Eating at maintenance will keep your current weight stable
🥗 Macro Recommendations
$ 112.00
g
$ 393.00
g
$ 80.00
g
Protein: 4 cal/g | Carbs: 4 cal/g | Fat: 9 cal/g
📋 Summary
Goal: Maintenance
These are estimates. Individual needs vary. Consult a healthcare provider or registered dietitian for personalized advice.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
export function calorieNeedsCalculator(form: FormTs) {
form.addRow(row => {
row.addTextPanel('header', {
computedValue: () => 'Calorie Needs Calculator',
customStyles: { 'font-size': '1.5rem', 'font-weight': '600', 'color': '#1e293b' }
});
});
 
form.addSpacer({ height: 20 });
 
// Personal Info Section
const personalSection = form.addSubform('personal', { title: '👤 Personal Information' });
 
personalSection.addRow(row => {
row.addInteger('age', {
label: 'Age',
min: 15,
max: 100,
defaultValue: 30,
suffix: 'years',
isRequired: true
}, '1fr');
row.addRadioButton('gender', {
label: 'Gender',
options: [
{ id: 'male', name: 'Male' },
{ id: 'female', name: 'Female' }
],
defaultValue: 'male',
isRequired: true
}, '1fr');
});
 
// Measurements Section
const measurementsSection = form.addSubform('measurements', { title: '📏 Body Measurements' });
 
measurementsSection.addRow(row => {
row.addRadioButton('units', {
label: 'Unit System',
options: [
{ id: 'imperial', name: 'Imperial (lbs, ft/in)' },
{ id: 'metric', name: 'Metric (kg, cm)' }
],
defaultValue: 'metric',
isRequired: true
});
});
 
// Imperial inputs
measurementsSection.addRow(row => {
row.addDecimal('weightLbs', {
label: 'Weight',
min: 66,
max: 700,
defaultValue: 176,
suffix: 'lbs',
isRequired: true,
isVisible: () => measurementsSection.radioButton('units')?.value() === 'imperial'
}, '1fr');
row.addInteger('heightFeet', {
label: 'Height (feet)',
min: 4,
max: 7,
defaultValue: 5,
suffix: 'ft',
isRequired: true,
isVisible: () => measurementsSection.radioButton('units')?.value() === 'imperial'
}, '1fr');
row.addInteger('heightInches', {
label: 'Height (inches)',
min: 0,
max: 11,
defaultValue: 10,
suffix: 'in',
isRequired: true,
isVisible: () => measurementsSection.radioButton('units')?.value() === 'imperial'
}, '1fr');
});
 
// Metric inputs
measurementsSection.addRow(row => {
row.addDecimal('weightKg', {
label: 'Weight',
min: 30,
max: 320,
defaultValue: 80,
suffix: 'kg',
isRequired: true,
isVisible: () => measurementsSection.radioButton('units')?.value() === 'metric'
}, '1fr');
row.addInteger('heightCm', {
label: 'Height',
min: 120,
max: 230,
defaultValue: 178,
suffix: 'cm',
isRequired: true,
isVisible: () => measurementsSection.radioButton('units')?.value() === 'metric'
}, '1fr');
});
 
// Activity Level Section
const activitySection = form.addSubform('activity', { title: '🏃 Activity Level' });
 
activitySection.addRow(row => {
row.addDropdown('activityLevel', {
label: 'Daily Activity Level',
options: [
{ id: 'sedentary', name: 'Sedentary (desk job, little exercise)' },
{ id: 'light', name: 'Lightly Active (light exercise 1-3 days/week)' },
{ id: 'moderate', name: 'Moderately Active (exercise 3-5 days/week)' },
{ id: 'active', name: 'Very Active (hard exercise 6-7 days/week)' },
{ id: 'extreme', name: 'Extremely Active (athlete/physical job)' }
],
defaultValue: 'moderate',
isRequired: true
});
});
 
activitySection.addRow(row => {
row.addTextPanel('activityDescription', {
computedValue: () => {
const activity = activitySection.dropdown('activityLevel')?.value() || 'moderate';
const descriptions: Record<string, string> = {
'sedentary': 'Multiplier: 1.2 - Office work with no exercise routine',
'light': 'Multiplier: 1.375 - Walking, light cardio, or casual sports',
'moderate': 'Multiplier: 1.55 - Regular gym sessions or sports 3-5x/week',
'active': 'Multiplier: 1.725 - Intense training nearly every day',
'extreme': 'Multiplier: 1.9 - Professional athlete or very physical labor'
};
return descriptions[activity] || '';
},
customStyles: { 'font-size': '0.85rem', 'color': '#64748b', 'text-align': 'center' }
});
});
 
// Goal Section
const goalSection = form.addSubform('goal', { title: '🎯 Your Goal' });
 
goalSection.addRow(row => {
row.addRadioButton('fitnessGoal', {
label: 'What is your goal?',
options: [
{ id: 'lose', name: 'Lose Weight' },
{ id: 'maintain', name: 'Maintain Weight' },
{ id: 'gain', name: 'Build Muscle' }
],
defaultValue: 'maintain',
isRequired: true
});
});
 
goalSection.addRow(row => {
row.addDropdown('deficitSurplus', {
label: 'Rate of Change',
options: [
{ id: 'slow', name: 'Slow (250 cal/day)' },
{ id: 'moderate', name: 'Moderate (500 cal/day)' },
{ id: 'aggressive', name: 'Aggressive (750 cal/day)' }
],
defaultValue: 'moderate',
isVisible: () => goalSection.radioButton('fitnessGoal')?.value() !== 'maintain',
tooltip: 'How aggressively you want to change weight'
});
});
 
form.addSpacer({ height: 20, showLine: true, lineStyle: 'dashed' });
 
// Results Section
const resultsSection = form.addSubform('results', { title: '🔥 Your Calorie Needs', isCollapsible: false });
 
resultsSection.addRow(row => {
row.addPriceDisplay('bmr', {
label: 'Basal Metabolic Rate (BMR)',
computedValue: () => {
const units = measurementsSection.radioButton('units')?.value() || 'metric';
const gender = personalSection.radioButton('gender')?.value() || 'male';
const age = personalSection.integer('age')?.value() || 30;
 
let weightKg: number;
let heightCm: number;
 
if (units === 'imperial') {
weightKg = (measurementsSection.decimal('weightLbs')?.value() || 176) * 0.453592;
const feet = measurementsSection.integer('heightFeet')?.value() || 5;
const inches = measurementsSection.integer('heightInches')?.value() || 10;
heightCm = ((feet * 12) + inches) * 2.54;
} else {
weightKg = measurementsSection.decimal('weightKg')?.value() || 80;
heightCm = measurementsSection.integer('heightCm')?.value() || 178;
}
 
// Mifflin-St Jeor Equation
let bmr: number;
if (gender === 'male') {
bmr = (10 * weightKg) + (6.25 * heightCm) - (5 * age) + 5;
} else {
bmr = (10 * weightKg) + (6.25 * heightCm) - (5 * age) - 161;
}
 
return Math.round(bmr);
},
variant: 'default',
prefix: '',
suffix: ' cal',
tooltip: 'Calories burned at complete rest'
}, '1fr');
row.addPriceDisplay('tdee', {
label: 'Daily Energy Expenditure (TDEE)',
computedValue: () => {
const units = measurementsSection.radioButton('units')?.value() || 'metric';
const gender = personalSection.radioButton('gender')?.value() || 'male';
const age = personalSection.integer('age')?.value() || 30;
const activity = activitySection.dropdown('activityLevel')?.value() || 'moderate';
 
let weightKg: number;
let heightCm: number;
 
if (units === 'imperial') {
weightKg = (measurementsSection.decimal('weightLbs')?.value() || 176) * 0.453592;
const feet = measurementsSection.integer('heightFeet')?.value() || 5;
const inches = measurementsSection.integer('heightInches')?.value() || 10;
heightCm = ((feet * 12) + inches) * 2.54;
} else {
weightKg = measurementsSection.decimal('weightKg')?.value() || 80;
heightCm = measurementsSection.integer('heightCm')?.value() || 178;
}
 
let bmr: number;
if (gender === 'male') {
bmr = (10 * weightKg) + (6.25 * heightCm) - (5 * age) + 5;
} else {
bmr = (10 * weightKg) + (6.25 * heightCm) - (5 * age) - 161;
}
 
const multipliers: Record<string, number> = {
'sedentary': 1.2,
'light': 1.375,
'moderate': 1.55,
'active': 1.725,
'extreme': 1.9
};
 
return Math.round(bmr * (multipliers[activity] || 1.55));
},
variant: 'success',
prefix: '',
suffix: ' cal',
tooltip: 'Total calories burned per day'
}, '1fr');
});
 
// Target Calories Section
const targetSection = form.addSubform('target', { title: '🎯 Target Calories', isCollapsible: false });
 
targetSection.addRow(row => {
row.addPriceDisplay('targetCalories', {
label: 'Daily Calorie Target',
computedValue: () => {
const units = measurementsSection.radioButton('units')?.value() || 'metric';
const gender = personalSection.radioButton('gender')?.value() || 'male';
const age = personalSection.integer('age')?.value() || 30;
const activity = activitySection.dropdown('activityLevel')?.value() || 'moderate';
const goal = goalSection.radioButton('fitnessGoal')?.value() || 'maintain';
const rate = goalSection.dropdown('deficitSurplus')?.value() || 'moderate';
 
let weightKg: number;
let heightCm: number;
 
if (units === 'imperial') {
weightKg = (measurementsSection.decimal('weightLbs')?.value() || 176) * 0.453592;
const feet = measurementsSection.integer('heightFeet')?.value() || 5;
const inches = measurementsSection.integer('heightInches')?.value() || 10;
heightCm = ((feet * 12) + inches) * 2.54;
} else {
weightKg = measurementsSection.decimal('weightKg')?.value() || 80;
heightCm = measurementsSection.integer('heightCm')?.value() || 178;
}
 
let bmr: number;
if (gender === 'male') {
bmr = (10 * weightKg) + (6.25 * heightCm) - (5 * age) + 5;
} else {
bmr = (10 * weightKg) + (6.25 * heightCm) - (5 * age) - 161;
}
 
const multipliers: Record<string, number> = {
'sedentary': 1.2,
'light': 1.375,
'moderate': 1.55,
'active': 1.725,
'extreme': 1.9
};
 
const tdee = bmr * (multipliers[activity] || 1.55);
 
const adjustments: Record<string, number> = {
'slow': 250,
'moderate': 500,
'aggressive': 750
};
 
const adjustment = adjustments[rate] || 500;
 
if (goal === 'lose') {
return Math.round(Math.max(tdee - adjustment, 1200));
} else if (goal === 'gain') {
return Math.round(tdee + adjustment);
}
return Math.round(tdee);
},
variant: 'large',
prefix: '',
suffix: ' cal/day'
});
});
 
targetSection.addRow(row => {
row.addTextPanel('goalExplanation', {
computedValue: () => {
const goal = goalSection.radioButton('fitnessGoal')?.value() || 'maintain';
const rate = goalSection.dropdown('deficitSurplus')?.value() || 'moderate';
 
const adjustments: Record<string, number> = {
'slow': 250,
'moderate': 500,
'aggressive': 750
};
 
const adjustment = adjustments[rate] || 500;
const weeklyChange = (Number(adjustment * 7 / 7700) || 0).toFixed(2); // ~7700 cal = 1kg
 
if (goal === 'lose') {
return `Deficit of ${adjustment} cal/day = ~${weeklyChange} kg (${(Number(parseFloat(weeklyChange) * 2.2) || 0).toFixed(1)} lbs) loss per week`;
} else if (goal === 'gain') {
return `Surplus of ${adjustment} cal/day = ~${weeklyChange} kg (${(Number(parseFloat(weeklyChange) * 2.2) || 0).toFixed(1)} lbs) gain per week`;
}
return 'Eating at maintenance will keep your current weight stable';
},
customStyles: { 'font-size': '0.9rem', 'color': '#475569', 'text-align': 'center', 'font-weight': '500' }
});
});
 
// Macros Section
const macrosSection = form.addSubform('macros', { title: '🥗 Macro Recommendations', isCollapsible: false });
 
macrosSection.addRow(row => {
row.addPriceDisplay('protein', {
label: 'Protein',
computedValue: () => {
const units = measurementsSection.radioButton('units')?.value() || 'metric';
const goal = goalSection.radioButton('fitnessGoal')?.value() || 'maintain';
 
let weightKg: number;
if (units === 'imperial') {
weightKg = (measurementsSection.decimal('weightLbs')?.value() || 176) * 0.453592;
} else {
weightKg = measurementsSection.decimal('weightKg')?.value() || 80;
}
 
// 1.6-2.2g per kg for muscle building, 1.2-1.6g for maintenance
const proteinPerKg = goal === 'gain' ? 2.0 : (goal === 'lose' ? 1.8 : 1.4);
return Math.round(weightKg * proteinPerKg);
},
variant: 'default',
prefix: '',
suffix: 'g',
tooltip: 'Essential for muscle repair and growth'
}, '1fr');
row.addPriceDisplay('carbs', {
label: 'Carbohydrates',
computedValue: () => {
const units = measurementsSection.radioButton('units')?.value() || 'metric';
const gender = personalSection.radioButton('gender')?.value() || 'male';
const age = personalSection.integer('age')?.value() || 30;
const activity = activitySection.dropdown('activityLevel')?.value() || 'moderate';
const goal = goalSection.radioButton('fitnessGoal')?.value() || 'maintain';
const rate = goalSection.dropdown('deficitSurplus')?.value() || 'moderate';
 
let weightKg: number;
let heightCm: number;
 
if (units === 'imperial') {
weightKg = (measurementsSection.decimal('weightLbs')?.value() || 176) * 0.453592;
const feet = measurementsSection.integer('heightFeet')?.value() || 5;
const inches = measurementsSection.integer('heightInches')?.value() || 10;
heightCm = ((feet * 12) + inches) * 2.54;
} else {
weightKg = measurementsSection.decimal('weightKg')?.value() || 80;
heightCm = measurementsSection.integer('heightCm')?.value() || 178;
}
 
let bmr: number;
if (gender === 'male') {
bmr = (10 * weightKg) + (6.25 * heightCm) - (5 * age) + 5;
} else {
bmr = (10 * weightKg) + (6.25 * heightCm) - (5 * age) - 161;
}
 
const multipliers: Record<string, number> = {
'sedentary': 1.2,
'light': 1.375,
'moderate': 1.55,
'active': 1.725,
'extreme': 1.9
};
 
let tdee = bmr * (multipliers[activity] || 1.55);
 
const adjustments: Record<string, number> = {
'slow': 250,
'moderate': 500,
'aggressive': 750
};
 
const adjustment = adjustments[rate] || 500;
 
if (goal === 'lose') {
tdee = Math.max(tdee - adjustment, 1200);
} else if (goal === 'gain') {
tdee = tdee + adjustment;
}
 
const proteinPerKg = goal === 'gain' ? 2.0 : (goal === 'lose' ? 1.8 : 1.4);
const protein = weightKg * proteinPerKg;
const fat = weightKg * (goal === 'lose' ? 0.8 : 1.0);
const proteinCals = protein * 4;
const fatCals = fat * 9;
const carbCals = tdee - proteinCals - fatCals;
 
return Math.round(Math.max(carbCals / 4, 50));
},
variant: 'default',
prefix: '',
suffix: 'g',
tooltip: 'Primary energy source'
}, '1fr');
row.addPriceDisplay('fat', {
label: 'Fat',
computedValue: () => {
const units = measurementsSection.radioButton('units')?.value() || 'metric';
const goal = goalSection.radioButton('fitnessGoal')?.value() || 'maintain';
 
let weightKg: number;
if (units === 'imperial') {
weightKg = (measurementsSection.decimal('weightLbs')?.value() || 176) * 0.453592;
} else {
weightKg = measurementsSection.decimal('weightKg')?.value() || 80;
}
 
// 0.8-1.0g per kg
const fatPerKg = goal === 'lose' ? 0.8 : 1.0;
return Math.round(weightKg * fatPerKg);
},
variant: 'default',
prefix: '',
suffix: 'g',
tooltip: 'Essential for hormones and nutrient absorption'
}, '1fr');
});
 
macrosSection.addRow(row => {
row.addTextPanel('macroNote', {
computedValue: () => 'Protein: 4 cal/g | Carbs: 4 cal/g | Fat: 9 cal/g',
customStyles: { 'font-size': '0.8rem', 'color': '#64748b', 'text-align': 'center' }
});
});
 
// Summary Section
const summarySection = form.addSubform('summary', {
title: '📋 Summary',
isCollapsible: false,
sticky: 'bottom'
});
 
summarySection.addRow(row => {
row.addTextPanel('summaryText', {
computedValue: () => {
const goal = goalSection.radioButton('fitnessGoal')?.value() || 'maintain';
const goalLabels: Record<string, string> = {
'lose': 'Weight Loss',
'maintain': 'Maintenance',
'gain': 'Muscle Building'
};
return `Goal: ${goalLabels[goal] || 'Maintenance'}`;
},
customStyles: { 'font-size': '1rem', 'font-weight': '600', 'text-align': 'center', 'color': '#1e293b' }
});
});
 
summarySection.addRow(row => {
row.addTextPanel('disclaimer', {
computedValue: () => 'These are estimates. Individual needs vary. Consult a healthcare provider or registered dietitian for personalized advice.',
customStyles: { 'font-size': '0.8rem', 'color': '#64748b', 'text-align': 'center' }
});
});
 
form.configureSubmitButton({
label: 'Save My Plan'
});
}
 

Frequently Asked Questions

What is TDEE?

TDEE (Total Daily Energy Expenditure) is the total number of calories you burn per day, including your basal metabolism, physical activity, and digestion. It's the key number for managing your weight.

What is BMR?

BMR (Basal Metabolic Rate) is the number of calories your body burns at complete rest just to maintain basic functions like breathing, circulation, and cell production.

How accurate is this calculator?

This calculator uses the Mifflin-St Jeor equation, which is considered one of the most accurate formulas. However, individual metabolism varies, so use these numbers as a starting point and adjust based on results.

How fast should I lose weight?

A safe rate of weight loss is 0.5-1 kg (1-2 lbs) per week. This typically requires a deficit of 500-1000 calories per day. Losing weight faster can lead to muscle loss and other health issues.

Can I customize this calculator?

Yes. You can adjust all parameters, add your branding, and embed it on your fitness or nutrition website to help visitors understand their calorie needs.