What breaks

Button not working on website: find the cause

The button is drawn, you press it, and the page does not move. Here is how to find which of four causes you have, and what a simulated visitor adds.

5 visitors try to .
First test free with an accountRun it from your coding agent

Why is my button not working on my website?

A button that looks live and does nothing has one of four causes: a layer on top takes the tap, a script failed before the button was wired up, a form button submitted the form and reloaded the page, or a disabled state was left behind. Open the browser's Console and Network tabs, press the button once, and read which one shows up. A simulated visitor taps the same button on a phone-width browser and reports the step where the press did nothing, any errors recorded on that step, and a screenshot of that screen.

What this looks like in a report

Who
Ilse, planning a wedding and comparing florists
How they arrived
Searched for a florist near her venue and opened the site on her phone
Where they stopped
Home page, at the consultation button below the packages

“The button said Book a consultation and I tapped it twice. Nothing opened. A banner covered the bottom of the button, so I assumed the florist was closed and went back to the search results.”

The fix. Move the cookie banner off the lower edge on phones, or give it a lower stacking order than the page's buttons. Then press the button at phone width and confirm the booking form opens before you ship.

An illustration. Run a test to see your own.See a real sample report

The click lands on a layer that is not the button

The button draws on screen, but the tap goes somewhere else. A cookie banner or a chat launcher can sit over its lower edge and take the press without showing anything. Or a script failed on page load, so no handler was ever attached and the press does nothing at all. A button inside a form submits that form by default, which reloads the page and looks like nothing happened. None of these show up on the owner's laptop, where the banner sits in a corner and the owner is already logged in.

  • Press the button in a private window, so your saved login and cookies do not change the result.
  • At phone width, check whether a banner, chat launcher or sticky bar covers any part of the button.
  • Read the Console on page load and right after the press for a red error line.
  • Look in the Network tab for a document request that starts when you press it.
  • Check the Elements panel for a disabled attribute, or pointer-events set to none, on the button or a parent.

How the press goes nowhere, step by step

A visitor scrolls down to the button, reads the label and taps it. Nothing opens. They tap again, a little harder, then look for another way in: the menu, the phone number in the footer, the back arrow. A few seconds later they leave. Your analytics shows a page view and no booking. Nothing in that record says whether a banner covered the button, a script failed, or the visitor simply changed their mind, so the stopped visit looks the same as a choice not to buy.

Four causes, and the check that separates each

The first cause is a layer on top. Open the developer tools and run document.elementFromPoint with the center of the button's position. If it returns a banner, a chat launcher or an empty box rather than the button, that layer takes the tap. The second cause is a script that failed before the button was wired up. One uncaught error can stop the rest of that file from running, and the Console shows it with a file name, while the page looks normal.

The third cause is a button with no type inside a form. A plain button submits the form by default. If a required field is empty, the browser shows its own message on that field, often off screen, and the page stays put, so the press looks dead. If the form posts, the page reloads and the visitor sees a brief flash. The fourth cause is a disabled state left behind. A button stuck in a loading state keeps its disabled attribute, or a parent sets pointer-events to none, and the browser ignores the tap without any error.

Press it once with the console and network open

Open a private window, clear the Console and Network tabs, then press the button once and read the result in this order. A red error at the press points to a script. A document request points to a form submit. A request that returns an error status points to the server. No request and no error points to a layer on top or to a disabled button, and the elementFromPoint check settles which one. Keep a phone-width window open as well, because the layer on top often exists only at that width.

Where a desktop press misses the phone overlay

On a laptop a cookie banner often sits in a corner, away from the button, so the press works. At phone width the same banner can slide onto the button's lower edge, and a desktop check misses it. A simulated visitor arrives at phone width as a stranger, taps the button, waits and looks. The report gives the step where the tap did nothing, any JavaScript errors and failed requests recorded on that step, and a screenshot of that screen. It does not open your developer tools, so the Console and the layer check are still how you name the element that took the tap.

What you get with Mimiq

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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 chat widget or a new banner can cover the button again

The same overlay can come back after the next release, when a new chat widget, banner or sticky bar lands on the same corner. Rerun the same phone visitor after each change to the layout, and confirm the button still takes the tap. With paid credits, a site password or a preview bypass lets the visitor reach a staging copy, so the same check can run on each preview deploy before release.

Starter

Try it on one launch

$9 once
120 credits, never expire

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
Buy 120 credits

Builder

Test every build

$19 a month
500 credits every month

About 20 tests of 5 visitors

  • Everything in Starter
  • Credits refill each month, and what is left rolls over once
  • Cancel anytime
Choose Builder

Pro

Test every release, as a team

$49 a month
1,500 credits every month

About 60 tests of 5 visitors

  • Everything in Starter
  • Credits refill each month, and what is left rolls over once
  • Cancel anytime
Choose Pro

Scale

Test at scale, every day

$149 a month
6,000 credits every month

About 240 tests of 5 visitors

  • Everything in Starter
  • Credits refill each month, and what is left rolls over once
  • Priority support
  • Cancel anytime
Choose Scale
$0for your first test, with a free account (Google sign-in, no card). It includes 50 credits, enough for 10 visitors. After that a visitor uses 5 credits, and packs start at $9 for 120 credits.
See a sample report

Questions

Why does the button work for me but not for visitors?

Your own browser is usually logged in, holds cookies from earlier visits, and may already have dismissed the cookie banner. A visitor arrives with none of that. Test in a private window first, then at phone width, before you assume the button works for everyone.

How do I know a banner is covering my button?

Look at the button's lower edge at phone width first. If any part of it sits under a banner, chat launcher or sticky bar, that is the cause. To confirm, run document.elementFromPoint with the button's center in the Console, and check that the element it returns is the button itself. If it is not, the layer is taking the tap.

Can a simulated test find a JavaScript error?

It records relevant JavaScript errors and failed app requests on the step where they happened, with a screenshot, so the error appears in the report beside the press. It does not name the line of your code to change.

Will a test show me how many visitors gave up on the button?

No. A simulated visitor shows where a run stopped, not a rate. It does not predict how many real people would have pressed the button, and it cannot read your analytics. Use your click counts before and after the fix for the rate, and use the test to confirm the press now does something.

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.

5 visitors try to .