What breaks
Submit button not working on website: find why
The visitor presses Send or Submit and nothing changes: no message, no spinner, no new page. This page shows how to tell a covered button, a disabled button and a stuck script apart, and what a simulated visitor can confirm.
Why is my submit button not working on my website?
A submit button that does nothing is blocked either by the page, which covers or disables the button, or by the code behind it, which failed or is still waiting for a reply. Press the button with the keyboard: if Enter or Space sends the form, something sits over the button, and if nothing sends, look at the button's markup and the console. A simulated visitor fills in the form, presses the button on a phone or a laptop, and records what changed, any error on the press and a screenshot.
What this looks like in a report
“I filled everything in and pressed Request quote. The button was grey and did not respond. I scrolled up and down looking for a message, found none, and went to a company that answered.”
The fix. Keep the button enabled, and when a required box is not ticked, show 'Tick the box to agree to the terms' beside that box and move focus to it. Test the form with the box unticked and then ticked, on a phone and a laptop.
An illustration. Run a test to see your own.See a real sample report
A press that changes nothing looks identical for four causes
The visitor presses the button and the screen does not move. No message appears, no spinner shows, and no new page loads. The cause could be a disabled button that looks enabled, a transparent layer from a banner or chat widget sitting over the button, a button placed outside the form it is meant to send, or a script that failed before the press did anything. Each one looks the same to the visitor. An owner who presses with a mouse on a large screen often gets through, because the owner's session is in a different state.
- Does Tab move focus to the button, and does Enter or Space send the form when the mouse press does nothing?
- Does the button still carry a disabled attribute in the Elements tab after every required box is ticked?
- Does a cookie banner, chat bubble or sticky bar sit over the button at phone width?
- Does the button sit inside the form element, or name the form with a form attribute?
- Does the console show an error on the press, or a request left pending from an earlier try?
Press it with the keyboard before you blame the click
Tab to the button and press Enter or Space. If the form sends, the button's own logic works, and the mouse or finger press is being taken by something else, such as a layer on top of the button or a target smaller than it looks. If the keyboard press also does nothing, the fault is in the button or the code behind it, and a covering layer is not the cause. This one test splits the two families of cause.
To find the layer, right-click the spot where the button sits at phone width, choose Inspect, and read the element the browser selects. A cookie banner, a chat widget or a sticky header above the button shows up by its name or class. It is easy to miss on a desktop, because the layer may appear only at phone width or after a short delay.
Disabled, outside the form, or missing a token: three markup states that look alike
A disabled attribute stays on a button after a failed try if the script that turns it back on never ran. Read the button in the Elements tab after the last box is ticked, and check the attribute. A button marked as a plain button, or placed outside the form element with no form attribute, sends nothing on press even when it looks right, because it is not a submit control for that form.
Some forms hide a verification token behind a widget. If the widget never loads, because a privacy setting or a blocked script stopped it, the token stays empty and the submit handler returns without a word. The console usually shows the blocked script. Check that the widget is visible and its script loads on the form page before you change the handler.
A script that failed earlier, or a request left pending
A press is handled by a script. If an error earlier on the page stopped that script before it attached the click handler, the press does nothing, and the console shows the error as the page loads. A press can also do nothing on a second try, when a first request is still waiting for a reply and the handler holds the button in a sending state. The Network tab shows that request as pending, with no response.
A simulated visitor records what the browser saw at each step: the press, any relevant JavaScript error, failed or slow app requests, and a screenshot of the button. The report puts each one on its step, so a slow request from an earlier try shows up beside the press. It cannot tell you whether a real visitor on another phone would hit the same layer, so check the layer on the phones your visitors use. For the full pre-launch pass, see the guide to testing a website before launch.
What you get with Mimiq
- 01
Run it by hand, or on every pull request
Paste a link and a task in the app and watch the visitors work. Or run them on every preview deploy: the GitHub Action comments on the pull request, any other CI can call the MCP endpoint, and your coding agent can run it too.
- 02
Bugs and usability problems in one report
The browser records errors and failed or slow requests on the step they happened. The visitors say where the wording or the steps confused them, and where they left.
- 03
Visitors that behave like your audience
Each visitor is a different profile with a reason to be there, matched to who the page is for, described by you, or built from your own customers.
- 04
A prompt to fix each problem
Every problem comes with a fix to paste into Cursor, Claude Code, Lovable or any coding agent, and one prompt hands over the top problems at once. Then send the same visitors through again.
- 05
Follow every visitor
See each visitor's whole path, step by step with screenshots, and what it was thinking at every step. Ask any visitor a question.
The browser records relevant JavaScript errors and failed or slow app requests encountered during the run, attached to the step where they occurred. The visitors are simulated: they find problems, they do not predict how many real people will convert.
A new banner or a moved footer can cover the submit again
A new cookie banner, a chat widget or a redesigned footer can cover the submit button again, and it can do so only at phone width. Rerun the same visitor after each design, script or form change, on a phone and a laptop, and compare where the press lands. Owners also test behind a site password and check each preview deploy before it goes live.
Starter
Try it on one launch
About 4 tests of 5 visitors
- Visitors on your landing page, signup and checkout
- Where they left and why, with a fix to copy for each problem
- Run it in the app or on every pull request
- Ask any visitor a question, included
- Test accounts and protected previews
Builder
Test every build
About 20 tests of 5 visitors
- Everything in Starter
- Credits refill each month, and what is left rolls over once
- Cancel anytime
Pro
Test every release, as a team
About 60 tests of 5 visitors
- Everything in Starter
- Credits refill each month, and what is left rolls over once
- Cancel anytime
Scale
Test at scale, every day
About 240 tests of 5 visitors
- Everything in Starter
- Credits refill each month, and what is left rolls over once
- Priority support
- Cancel anytime
Questions
Why does the button work on my laptop and not on my phone?
A phone screen can place a banner, chat bubble or sticky bar over the button, and a tap can land on that layer instead. A phone may also draw the button smaller than the laptop does, so the tap area can miss it. Test at phone width with a finger or a touch emulator, not only with a mouse.
Does a simulated visitor prove the form was sent?
It shows whether the press changed the page, whether a request left, and whether a message appeared. It cannot tell you that the server saved the submission, so check your form tool or database for the record. That record is the final proof.
Why does the button fail only for some visitors?
A verification widget, a privacy setting or a slow script can stop a form for some visitors and not others. A visitor who blocks third-party scripts never sees the widget, and one on a slow connection may press before the handler is attached. Test once with a privacy blocker turned on yourself, and once in a fresh browser.
Should the button be disabled until the form is valid?
Keep the button enabled and let the form explain what is missing. A disabled button gives no reason, so a visitor cannot tell whether they missed a box or the site is broken. Show a message beside the missing field on press, and move focus to the field it names.
Keep reading
Send visitors and see what breaks first.
Your first test is free: sign in with Google and it starts right away. Last checked 2026-11-02.