Asking users to enter their height and weight is a relatively small ask. In practice, it’s a surprisingly high-abandonment step in sizing flows. Users hesitate, type the wrong units, hit confusing validation errors, or simply decide it’s too much friction and leave.
The design decisions around this form aren’t about aesthetics — they have measurable effects on whether users complete the flow and whether the data they enter is accurate enough to produce a useful recommendation.
Why users abandon measurement forms
Research on sizing tool adoption identifies three primary abandonment drivers:
Trust uncertainty: “What are you doing with my height and weight? Will this be stored? Who can see it?” Users who aren’t sure will often abandon rather than ask.
Friction: A form that requires unit conversion, has confusing validation, or asks for too many fields loses users at each step. Every additional input is a new opportunity to exit.
Uncertainty about accuracy: “I don’t know my exact measurements.” This is especially common for waist and hip measurements that users rarely know.
The design response to each of these is different.
Field order: easiest to hardest
Order input fields from the measurement users are most confident about to the least:
- Height — most users know this, most entered in round numbers
- Weight — most users know approximately, but may be more sensitive about revealing
- Gender/sex — required for anthropometric prediction; straightforward for most users
- Waist/hip measurements — if you ask for these, put them last and make them optional
<!-- Recommended field order -->
<form id="measurement-form">
<!-- Step 1: Height — most users know this confidently -->
<div class="field-group">
<label for="height">Height</label>
<div class="input-with-unit">
<input type="number" id="height" name="height" min="130" max="220"
placeholder="170" required />
<select id="height-unit" name="height_unit">
<option value="cm">cm</option>
<option value="ft">ft & in</option>
</select>
</div>
</div>
<!-- Step 2: Weight -->
<div class="field-group">
<label for="weight">Weight</label>
<div class="input-with-unit">
<input type="number" id="weight" name="weight" min="30" max="250"
placeholder="68" required />
<select id="weight-unit" name="weight_unit">
<option value="kg">kg</option>
<option value="lbs">lbs</option>
</select>
</div>
</div>
<!-- Step 3: Gender/body shape — short label reduces sensitivity -->
<div class="field-group">
<label>Body proportions</label>
<div class="radio-group">
<label><input type="radio" name="gender" value="female" /> Typically female proportions</label>
<label><input type="radio" name="gender" value="male" /> Typically male proportions</label>
</div>
</div>
</form>
Unit switching that doesn’t confuse
Users from metric countries will enter cm and kg. Users from the US will enter feet/inches and pounds. Both need to be able to use their preferred units without converting manually.
Common mistakes:
- One select for all units (forces users to change both at once)
- No confirmation that their entered value was understood (is “6 foot 2” entered as “6.2” or “6” ft + “2” in a separate field?)
- Rounding that produces obviously wrong conversions
// Handle height unit switching
const heightInput = document.getElementById('height');
const heightUnit = document.getElementById('height-unit');
const heightFtField = document.getElementById('height-ft');
const heightInField = document.getElementById('height-in');
function switchHeightUnit(newUnit) {
const currentValue = parseFloat(heightInput.value);
if (newUnit === 'ft' && currentValue) {
// Convert stored cm value to ft/in for display
const totalInches = currentValue / 2.54;
const feet = Math.floor(totalInches / 12);
const inches = Math.round(totalInches % 12);
heightFtField.value = feet;
heightInField.value = inches;
heightInput.style.display = 'none';
document.getElementById('ft-in-group').style.display = 'flex';
} else if (newUnit === 'cm' && currentValue) {
// Convert ft/in back to cm
const feet = parseInt(heightFtField.value) || 0;
const inches = parseInt(heightInField.value) || 0;
const cm = Math.round((feet * 12 + inches) * 2.54);
heightInput.value = cm;
heightInput.style.display = 'block';
document.getElementById('ft-in-group').style.display = 'none';
}
}
heightUnit.addEventListener('change', (e) => switchHeightUnit(e.target.value));
// Always store internally in cm — convert to mm when calling API
function getHeightInMm() {
if (heightUnit.value === 'cm') {
return Math.round(parseFloat(heightInput.value) * 10);
} else {
const feet = parseInt(heightFtField.value) || 0;
const inches = parseInt(heightInField.value) || 0;
return Math.round((feet * 12 + inches) * 25.4);
}
}
Validation that doesn’t block or embarrass
Bad validation: “Invalid height. Must be between 130 and 220 cm.” This is technically correct but feels like an accusation.
Better patterns:
Inline correction suggestions:
"That height (220cm+) is outside our typical range. Is this in feet and inches?
If so, switch to ft/in above."
Progressive validation: Validate only on blur (when the user leaves the field), not on every keystroke. Keystroke validation for a number field is jarring.
Soft validation for unusual values: Heights above 210cm or BMI below 15 are unusual but not impossible. Display a soft warning rather than blocking submission:
"That's quite tall — just double-checking: are you entering 218 cm, or did
you mean to switch to feet and inches?"
function validateHeight(value, unit) {
const cm = unit === 'cm' ? value : value * 30.48; // Simplified for ft
if (cm < 100 || cm > 250) {
return {
valid: false,
message: "Height seems outside normal range. Check units and try again.",
blocking: true
};
}
if (cm < 140) {
return {
valid: true,
message: "Short stature noted — our model supports heights from 130cm.",
blocking: false,
type: "soft_warning"
};
}
if (cm > 210) {
return {
valid: true,
message: "Tall height noted. Predictions are less precise at extremes.",
blocking: false,
type: "soft_warning"
};
}
return { valid: true };
}
Trust signals that reduce hesitation
Users who don’t understand what you’ll do with their data hesitate. The most effective trust signals:
Adjacent to the form, not in fine print:
We use your height and weight to recommend your size.
We don't store your measurements. Nothing links this to your identity.
Use “typical” language for the gender field: “Body proportions” or “sizing type” rather than “gender” reduces the chance users are confused or uncomfortable with the framing.
Show the output before the form: If users can see what they’ll get (a size recommendation, a fit profile), they’re more motivated to fill in the form. A preview like “Enter your measurements to see your recommended size for this garment” is more motivating than a form with no context.
Don’t require account creation. If users must create an account to get a size recommendation, many will abandon. Let them get the recommendation anonymously. Offer to save it to an account as a secondary step.
Making weight input less sensitive
Weight is more psychologically sensitive than height. Some tactics:
Range input as alternative: Instead of asking for exact weight, offer a slider or range selection. “Select your approximate weight range” with 5kg increments reduces precision anxiety. The prediction is slightly less accurate but completion rate improves.
Context label: “Approximate is fine” next to the weight field reduces the sense that the user needs to be precisely accurate.
Rounded weight: Accept 70 as a valid input; don’t require 70.5. The API handles float weights, but rounding to the nearest kg in the UI reduces friction.
What to do when the user doesn’t know their measurements
For waist and hip measurements (if you ask for them), many users genuinely don’t know. Options:
Make them optional: “Optional: entering these improves accuracy.” Many users who don’t know will skip and still complete the required fields.
Provide an estimator: “Not sure? Based on your height and weight, your waist is likely around 72–78cm for a female of your height/weight.” This is using a preliminary API call to give users a starting point, which they can then confirm or adjust.
Provide measurement instructions: A diagram showing exactly how to measure with a tape. This increases the chance users who have a tape measure will actually measure rather than guessing.
The minimum viable form
For maximum completion rate with acceptable accuracy: ask only for height, weight, and gender. This is the minimum that enables a meaningful body dimension prediction. Every additional field reduces completion rate; each reduction in completion rate reduces the value of your sizing feature.
Adding optional fields (waist, hip, chest) improves accuracy for users who fill them in, but don’t let them become barriers for users who don’t.
Measurement form design is a conversion problem, not just a UI problem. The goal is accurate data collection with maximum completion rate. These goals are sometimes in tension — fewer, easier fields complete at higher rates but produce less precise inputs. The balance point depends on how accuracy-sensitive your sizing use case is: a made-to-measure tailoring application needs more inputs than a t-shirt recommendation.