Let's say there is some feature in an application (accessed via a button) that only becomes available once a number of criteria are met.

Off the top of my head, there are 3 options here:

Hide the button

When the relevant form/screen is loaded, the button is not visible if the criteria have not been met.

Pros: It is crystal clear that the option isn't available

Cons: There could be a large number of support calls due to the "missing" functionality

Disable the button

Grey out the button if the criteria have not been met

Pros: The user can see that the option is available but isn't currently valid

Cons: There could be a large number of support calls as they can't press the button

Button always enabled

The user can always press the button, but a message is displayed saying what missing criteria need to be met

Pros: The users are told why the option isn't available

Cons: The message will have to change as the criteria change. The criteria may also not mean much to the user and there may be some support calls to clarify what the message means

I realise this is somewhat abstract, and I'm loathe to give a concrete example as the point I'm making might be lost, but consider:

There is a weekly sales report button available on the application which becomes valid when:

  • A manager is logged in (or a manager gives temporary access)
  • It is a monday morning
  • A printer is attached
  • The figures are available on the server following completion of some backend process

My questions:

  1. Are there general rules that can be applied here or is it a question of context/preference?
  2. Are there any other options other than those listed above?

My only other thought was that if the option isn't available, a screen could pop up with a checkbox type list detailing the criteria that haven't been met (much like a SQL Server install) but this feels like overkill.

  • Disabling the button is my preferred way, because the user interface stays consistent and unchanged. To supply additional hints to the user, you could use a status text ("Get your manager's approval to forward this report ...") or you could put helpful information in the tooltip text for the button.
    – Axel Kemper
    Commented May 16, 2013 at 10:57
  • @BartvanIngenSchenau That sounds perfect. How do I go about migrating this?
    – Robbie Dee
    Commented May 16, 2013 at 11:41
  • @RobbieDee - I think the accepted way is to flag the question and add a migration request to the flag comment. Which I just did.
    – MadKeithV
    Commented May 16, 2013 at 11:51
  • @MadKeithV OK, I've flagged this for moderator attention.
    – Robbie Dee
    Commented May 16, 2013 at 12:05

2 Answers 2


In your case I would:

Hide the button if it's not a manager logged on.

Disable the button if it's not a Monday.

Enable the button and give a message if there's no printer attached. Also show a message if the reports aren't ready yet and give an approximation of when they will be.

My reasoning behind it:

Users don't need to know about what they won't be using. It will only spark curiosity and have them trying to get some way to enable the button.

If functionality is not available with a good reason (it's not a Monday) then disable it.

If functionality is not available with an unclear reason (last week I could print my reports at 11 am), show a message to explain the reason.

  • 2
    Instead of disabling if not Monday, the button could also be always enable to print the report of last week.
    – Bart van Ingen Schenau
    Commented May 16, 2013 at 11:08
  • Excellent. I had rather thought of this as a binary decision whatever I opted for but a combination of all three could well be appropriate for complex cases.
    – Robbie Dee
    Commented May 16, 2013 at 11:52
  • So I have to view my weekly reports on mondays only. What if I have a day off? And I can't view my weekly reports unless I can also print them? Scuse me? Save some trees? Commented May 16, 2013 at 16:06
  • Yes, I was a bit worried people would get caught up in the example rather than the details of the question but briefly: 1) The reports need to be printed so they can be signed off for auditing purposes 2) Historical reports can also be printed off in a separate part of the application.
    – Robbie Dee
    Commented May 16, 2013 at 21:17

If I may propose a 4th alternative:

Don't use a button. Rather, when these conditions are met (see below for further details), propose to printout the weekly sales report when the manager arrives at the appropriate section to execute it. At that point, if the manager refuses, provide a button only then so that the option remains viable.

Also, some techniques for preconditions like these:

  1. Eliminate conditions which you're not expected to handle. For example, the printer being attached is a condition that, although you may be able to tell if a printer is attached, most users won't assume to be true. Therefore, you're not expected to handle that situation.
  2. Conditions which are difficult to verify should be handled by bringing it to the attention of the user rather than denying the possibility of using that functionality (which becomes frustrating for a user). If figures are not available on the server following completion of some backend process, the user won't know and probably won't care. You must allow the user to try anyway, and if the data is not available, show "No error found to print!" on the screen.
  3. When it comes to permissions (or other situations in which user will not be able to make certain functionality work on their own), it is generally better to hide that which a user cannot access rather than show it as grayed out. This is because it implies that there is something which can be done to make it active. So in this case, no button unless user is a manager.

Also, perhaps you should consider making your printout work on Tuesday, if nobody printed it out on Monday. Otherwise you risk that your client will be scratching their heads as to why they can't seem to print out something most days, but for some strange reason, they can on a monday.

Not the answer you're looking for? Browse other questions tagged or ask your own question.