🏠 Home 👤 About ⚡ Skills 💼 Portfolio 📦 Packages 📝 Blog ✉ Contact ✉ Contact Now
All Articles

Building Forms People Actually Complete

Most form abandonment is not caused by length. It is caused by uncertainty — not knowing what is expected, what went wrong, or how much is left.

Junaid Ali 2 min read 0 views

I have built a lot of forms — booking flows, multi-step intake forms, checkout. The completion rate difference between a careless form and a considered one is enormous, and almost none of it is about how many fields there are.

Validate at the Right Moment

Validating while someone types tells them their half-typed email is invalid. Validating only on submit makes them hunt for what broke.

The pattern that works: validate on blur, then re-validate on input only after that field has already errored — so the error clears as soon as they fix it.

Error Messages Must Say What to Do

"Invalid input" is not a message. "Enter a date after today" is. Every error should name the field, describe the problem, and state the fix.

Use the Right Input Type

<input type="email" inputmode="email" autocomplete="email">
<input type="tel" inputmode="tel" autocomplete="tel">

On mobile this changes the keyboard that appears. Getting it wrong makes a two-second field take fifteen.

Autocomplete Is Free Conversion

Correct autocomplete attributes let the browser fill an address in one tap. Developers disable it far more often than any user has asked them to.

Labels, Not Placeholders

Placeholder-only labels disappear the moment someone types, so nobody can check their work — and screen readers handle them inconsistently. Use a real <label>.

Show Progress on Multi-Step Forms

"Step 2 of 4" costs nothing and dramatically reduces abandonment. Validate each step before advancing, and never lose entered data when someone goes back.

Save Drafts

For any long form, persist to localStorage as they type. A dropped connection or an accidental refresh should not cost someone ten minutes.

Disable the Submit Button While Submitting

Otherwise you will get duplicate records. Disable it, change the label to "Sending…", and re-enable on failure.

Tagged UX Frontend Forms Accessibility
Share this article

Want this built properly?

I take on a small number of projects at a time so each one gets real attention.

WhatsApp Teams LinkedIn Facebook GitHub