WooCommerce validates submitted field names and values, not what the customer appears to see. A field can look filled while its value belongs to a duplicate input, is disabled, has the wrong name or is removed by JavaScript before submission.
Do not disable all required-field validation. First identify which field WooCommerce receives as empty and why the visible control is not supplying it.
Capture the exact validation error
Record the field label, country, shipping choice, account state, browser and device. Test with non-sensitive data in a private window and reproduce once.
Inspect the checkout network response. WooCommerce usually returns structured error content even when the page scroll or theme styling hides it. Confirm whether the error names billing, shipping or a custom field.
Compare visible inputs with posted names
Use browser developer tools to inspect the input’s name, id, value, disabled state and enclosing checkout section.
<!-- The name, not the label, determines the submitted key -->
<input id="billing_phone"
name="billing_phone"
type="tel"
value="600000000">
Disabled inputs are not submitted. An input without a name is not submitted. Two elements sharing an ID can cause a script or label to update the wrong control.
Never include a real customer address or phone number in saved network captures.
Check browser autofill
Autofill can paint a visible value without triggering the change or blur event expected by custom JavaScript. Mobile browsers and password managers make this especially common.
Type the value manually and compare. If manual entry works, update the custom code to read the actual field at submission and respond to appropriate input events. Do not disable browser autofill globally; it is valuable for conversion and accessibility.
Review country and address updates
Changing country, state or “ship to a different address” triggers checkout updates. A plugin may replace field markup and discard a value, or make a hidden regional field required.
Watch the Elements panel during update_checkout. Confirm the final visible input has the expected name and value immediately before submission. Test countries with and without state or postcode requirements.
Inspect field customisation hooks
Themes and plugins can alter checkout fields through PHP filters and JavaScript. Search custom code for the reported key and for required flags.
add_filter( 'woocommerce_checkout_fields', function ( $fields ) {
// Confirm the same key is rendered, posted and validated.
return $fields;
} );
A common defect is renaming the rendered field while validation still checks the old key. Another is validating shipping fields even when the order uses billing details.
Distinguish classic checkout from Checkout Blocks
Classic shortcode checkout and WooCommerce Checkout Blocks use different extension APIs. Code written for classic PHP field filters may not control a block field as expected.
Confirm which checkout the page actually uses. Choose an extension compatible with that implementation and current WooCommerce version. Avoid mixing a copied classic template with block-specific assumptions.
Check cache and stale scripts
After field code changes, a cached page or old JavaScript bundle may render yesterday’s field schema against today’s PHP validation. Compare asset versions and response cache headers as an anonymous visitor.
Purge the relevant page and generated assets after deployment. Do not clear active carts unless session data is genuinely involved.
Repair and test validation behaviour
Align the rendered name, posted value and server-side validation. Correct conditional required rules and duplicate markup. Keep legal, tax, shipping and fraud requirements intact.
Test blank values to confirm helpful errors still appear, then valid autofilled and manually typed values on desktop and mobile. Complete the order and verify payment, tax, shipping, stock and email.
Recurring care should include checkout-field tests after WooCommerce, theme, address, translation and optimisation updates. Field failures often return when only the happy path is checked.