Our main consideration was to try and build something that let us do lots of different flexible things using basic building blocks configured in various ways.
90% of users only use 10% of the functionality of any software (I think that's the generally accepted rule). The particular 10% varies from user to user.
What we wanted was a system sufficiently malleable that it would allow us to address all those various 10%s without having to write lots of different code - and that means thinking a lot about concepts and the relationships between them.
We currently have a number of named concepts including "a user", "a group", "an article", "a category", "a capability", "a navigation aid" etc - but often we need to talk to our clients in terms of "visitors", "members", "pages", "buckets", "facilities" and "links".
Essentially the fundamental ideas are based around things and their attributes - which can all get a bit abstract. Names can be very misleading, and can constrain the thought process.
Many customers want different designs for aspects of their sites, and luckily we realised this at an early stage and wrote in the flexibility to create customer-specific templates (based as closely or loosely as required on the system default) for altering both presentation and facilities offered.
We also have customer-specific code in some cases, which we try to implement in a modular fashion (so one customer's requirements don't impose a significant maintenance burden across all the Novacaster sites). If more than one customer wants similar new functionality, we try to reduce it to the core ideas and implement them as building blocks that can then be adapted or employed elsewhere for different related requriements.
The interface is the hardest bit - as I've said before, many web interfaces are a chaos of different technologies, each employed to achieve a certain effect in the whole. We're pretty much pure HTML forms-driven (widest possible compatibility), but as a result some aspects are clunkier to use than might be achievable if we were writing, say, a standalone desktop application.