Understandable / 3.3 Input Assistance
3.3.7Redundant Entry
Level ANew in 2.2Do not require users to re-enter information they have already provided within the same process. Auto-fill it or let them select from previously entered values.
New success criterion added in WCAG 2.2
This criterion was introduced in WCAG 2.2 and was not part of WCAG 2.1. Refer to the links below for detailed guidance.
Why should "redundant entry" be avoided?
WCAG 2.2 Success Criterion 3.3.7 requires that information already entered within the same process is not required to be re-entered. Previously entered values should be auto-filled or made selectable for reuse.
You're likely already familiar with "auto-fill or let users select from previously entered values," so here we'll dig into why this matters.
- People with cognitive or memory difficulties: Remembering what they just entered is challenging, and re-entry causes errors and fatigue. The instruction "enter it again" is itself a burden.
- People with motor impairments: Typing each character requires significant effort. Typing the same address twice is simply double the cost.
- Screen reader users: Navigating back to a previous form step to check values is especially tedious with audio output.
- All users: Making people type the same thing twice is simply a poor experience and leads to increased abandonment rates. Accessibility and UX are two sides of the same coin.
Tip
Exceptions include "memory tests" and "password confirmation" where re-entry has inherent purpose. See the "Exceptions" section below.
Failing Example (Same Address Entered Twice)
A common failure in e-commerce checkout: after entering a shipping address, users must manually re-enter the exact same information for the billing address.
You must re-enter the same address in the billing section, even if it's identical to shipping.
Passing Example (Auto-fill with "Same as Above")
A single "Billing address is the same as shipping" checkbox solves the problem. When checked, shipping values are automatically copied to billing fields, and the fields are disabled.
One checkbox eliminates re-entry. Changes to shipping are instantly reflected in billing.
Implementation (Code)
Good / Recommended
The autocomplete attribute lets the browser auto-fill with previous values (a supplementary measure). In addition, a "Same as above" checkbox that copies values from a previous step is the most user-friendly implementation.
Markup (Shipping → Checkbox → Billing):
<!-- Shipping Address -->
<fieldset>
<legend>Shipping Address</legend>
<div class="field">
<label for="s-name">Full Name</label>
<input type="text" id="s-name" name="s-name"
autocomplete="name" />
</div>
<div class="field">
<label for="s-zip">Postal Code</label>
<input type="text" id="s-zip" name="s-zip"
autocomplete="postal-code" />
</div>
<div class="field">
<label for="s-addr">Address</label>
<input type="text" id="s-addr" name="s-addr"
autocomplete="street-address" />
</div>
</fieldset>
<!-- "Same as above" checkbox -->
<label class="same-label">
<input type="checkbox" id="billing-same" />
Billing address is the same as shipping
</label>
<!-- Billing Address -->
<fieldset>
<legend>Billing Address</legend>
<div class="field">
<label for="b-name">Full Name</label>
<input type="text" id="b-name" name="b-name"
autocomplete="billing name" />
</div>
<div class="field">
<label for="b-zip">Postal Code</label>
<input type="text" id="b-zip" name="b-zip"
autocomplete="billing postal-code" />
</div>
<div class="field">
<label for="b-addr">Address</label>
<input type="text" id="b-addr" name="b-addr"
autocomplete="billing street-address" />
</div>
</fieldset>Script to auto-copy billing from shipping via checkbox:
const checkbox = document.getElementById('billing-same');
const shippingIds = ['s-name', 's-zip', 's-addr'];
const billingIds = ['b-name', 'b-zip', 'b-addr'];
function getEl(id) {
const el = document.getElementById(id);
if (!el) throw new Error('element not found: ' + id);
return el;
}
function syncBilling() {
const same = checkbox.checked;
shippingIds.forEach((sid, i) => {
const s = getEl(sid);
const b = getEl(billingIds[i]);
b.value = same ? s.value : '';
b.disabled = same;
});
}
checkbox.addEventListener('change', syncBilling);
// Sync in real time when shipping fields change
shippingIds.forEach((sid, i) => {
getEl(sid).addEventListener('input', () => {
if (checkbox.checked) getEl(billingIds[i]).value = getEl(sid).value;
});
});Note
Adding section tokens like autocomplete="billing name" lets the browser manage shipping and billing as separate contexts. Combined with the JS checkbox copy, this gives users more options.
Bad / Avoid
Why forcing re-entry is problematic:
- Making users type the same information twice imposes both cognitive load and input cost.
- Typos can cause mismatches between shipping and billing, leading to payment errors or incorrect deliveries.
- For people with motor impairments, extra input directly leads to fatigue and pain.
- Screen reader users must navigate back to a previous page to verify and re-enter values.
Exception: Cases where re-entry serves an intentional purpose (e.g., email confirmation field, password confirmation) are exempt from this criterion. See the "Exceptions" section below.
Exceptions
Re-entry is permitted in the following cases.
- Re-entry is essential
- Password confirmation (intentionally entering twice to catch typos),email confirmation, memory tests or learning quizzes (where testing recall is the purpose) — re-entry itself has meaning, so these are exceptions.
- Information is no longer valid
- If a session has expired, or values from a previous step have been updated and are now outdated, re-entry may be required.
- Security reasons
- For sensitive operations (financial transactions, re-authentication, etc.) where caching is intentionally avoided, this is also an exception.
Checklist
- Information entered in a previous step within the same process is not required to be re-entered
- A "Same as above" checkbox, "Use previous value" button, or similar reuse mechanism is provided
- Auto-copied values can be edited by the user (unchecking the checkbox re-enables the fields)
autocompleteattributes are properly set and browser auto-fill is not blocked- All input fields have a
<label>associated viafor/id - Checkboxes also have an associated
<label> - Groups like shipping/billing are separated with
<fieldset>/<legend> - Verified that no exceptions apply (password confirmation, memory tests, expired information)
- Keyboard-only operation works and focus rings are visible
Normative References
- Success Criterion 3.3.7 Redundant Entry — WCAG 2.2(opens in a new tab)The normative requirement text.
- Understanding Redundant Entry — W3C(opens in a new tab)Official guidance on intent, examples, and techniques.