3.3.7 Redundant Entry
Level: A | Principle: Understandable | Since: WCAG 2.2 | Automation: Manual
What This Means
Information previously entered by or provided to the user during a process must be either auto-populated or available for the user to select — unless re-entering is essential (e.g., confirming a password) or the information is no longer valid. Users should not be forced to type the same data twice in a multi-step form.
Who This Affects
- Cognitive disability users — re-entering information increases cognitive load and the chance of errors; they may not remember what they typed on a previous step
- Motor impairment users — retyping is physically taxing and time-consuming for users with limited dexterity
- Screen reader users — navigating back to find previously entered data and re-entering it is a significant burden
- Everyone — redundant entry is frustrating and increases form abandonment
Common Pitfalls
1. Asking for the same address twice in a checkout flow
<!-- Step 1: Shipping address -->
<h2>Shipping Address</h2>
<input name="ship_street" placeholder="Street">
<input name="ship_city" placeholder="City">
<input name="ship_zip" placeholder="ZIP">
<!-- Step 2 — Bad: asks for billing address from scratch -->
<h2>Billing Address</h2>
<input name="bill_street" placeholder="Street">
<input name="bill_city" placeholder="City">
<input name="bill_zip" placeholder="ZIP">
2. Asking for name and email again on a confirmation page
<!-- Step 1: Contact info -->
<input name="name" placeholder="Full name">
<input name="email" placeholder="Email">
<!-- Step 3 — Bad: asks for name and email again -->
<p>Please re-enter your contact details for confirmation:</p>
<input name="name" placeholder="Full name">
<input name="email" placeholder="Email">
3. Multi-page form that loses data on back navigation
<!-- Bad: pressing back clears all previous fields, forcing re-entry -->
How to Fix
Provide a "same as" checkbox
<h2>Shipping Address</h2>
<label for="ship-street">Street</label>
<input id="ship-street" name="ship_street">
<label for="ship-city">City</label>
<input id="ship-city" name="ship_city">
<h2>Billing Address</h2>
<label>
<input type="checkbox" id="same-address" onchange="copyAddress()">
Same as shipping address
</label>
<label for="bill-street">Street</label>
<input id="bill-street" name="bill_street">
<label for="bill-city">City</label>
<input id="bill-city" name="bill_city">
Auto-populate fields from previous steps
function PaymentStep({ formData }) {
return (
<form>
<h2>Payment Details</h2>
<label htmlFor="name">Name on card</label>
<input
id="name"
name="card_name"
defaultValue={formData.fullName}
/>
<label htmlFor="email">Receipt email</label>
<input
id="email"
name="receipt_email"
defaultValue={formData.email}
/>
</form>
);
}
Preserve data on back navigation
function MultiStepForm() {
const [formData, setFormData] = useState({});
const [step, setStep] = useState(1);
const updateField = (field, value) => {
setFormData(prev => ({ ...prev, [field]: value }));
};
return (
<>
{step === 1 && (
<StepOne data={formData} onChange={updateField} />
)}
{step === 2 && (
<StepTwo data={formData} onChange={updateField} />
)}
<button onClick={() => setStep(s => s - 1)} disabled={step === 1}>
Back
</button>
<button onClick={() => setStep(s => s + 1)}>
Next
</button>
</>
);
}
Exception: re-entry for security purposes is acceptable
<!-- Acceptable: confirming password is essential for security -->
<label for="password">Password</label>
<input id="password" type="password" name="password">
<label for="confirm-password">Confirm password</label>
<input id="confirm-password" type="password" name="confirm_password">
How to Test
- Walk through every multi-step form on the site (checkout, registration, application processes).
- At each step, check whether any field asks for information already entered in a previous step (name, email, address, phone).
- If the same information is needed again (e.g., billing address matching shipping address), verify it is auto-populated or available via a "Same as above" checkbox.
- Navigate backward in the form and confirm all previously entered data is preserved.
- Pass: No information is requested twice in a multi-step process, or repeated fields are auto-populated with previously entered data.
- Fail: Any field in a later step forces the user to re-type information already provided, or navigating backward clears previously entered data.
axe-core Rules
This criterion cannot be detected by automated tools. It requires understanding the full user journey across multiple form steps to identify redundant fields.