The rule I try to follow is to keep things as simple as you can. So, the levels of complexity for writing an app might look like this:
Level 1: command line program. Usable for yourself and others who know their way around the shell. Great for simple tools.
Level 2: Desktop GUI. More complicated, but necessary when you have non-technical users.
Level 3: Webapp with simple browser interface. When you need a GUI and need to allow access to many users all at once (possibly access to the same instance of the app). Drawbacks are that it's slow (much slower than a regular desktop GUI app) and relatively clunky. Also, you need a webserver to run it on, and the setup time that goes along with that. Also keyboard commands probably won't work and so there will be a lot of mousing around for the user.
Level 4: Webapp with some kind of Ajaxy or Javascripty client side. So, you need this even higher level of complexity when you have non-technical users who demand a prettier interface but the app also needs to be usable by lots of people on the net at once. Drawbacks are the same as with a regular webapp but also include a much more complex design, more maintenance, and more testing with different browsers.
The rule is, you don't go up the complexity ladder if you don't have to.