DotNetNuke is a powerful and sophisticated framework for building websites, web services, and web applications. Out of the "box" you get the framework, a couple of dozen or more modules that provide specific functionality, and access to a variety of third-party modules and skins. Some a free and/or open-source. Others are commercial products.
Using this collection of tools, I can build the bones and add a lot of meat to a new website in short order. My quess is that maybe 85% of what I often need to do can be done using free and open-source components. I can do 95% or more by adding a few commercial modules.
Often, there's something else needed, and that's where things can get sticky. What should you do?
In several recent projects, the "what should we do" part was answered by customizing existing modules. But, rather than backing ourselves into a "if you customize it, how will you upgrade it" corner, we've found it useful to work with the module developers to build our needed functionality into the product.
In one case, we needed to integrate two modules. We contracted with the developer of one of the modules to add this functionality. That integration was quite successful, and the functionality has become a standard feature.
In the second case, we purchased the module source code. We have now added another feature to the module -- it extends an existing function. We plan to donate our modifications to the module developer, with the hope that our additions will again make it into future standard versions of that product.
The lesson here is that you don't have to write custom modules. You can add functions to existing modules. If you do this carefully, there is a good chance that what you have done can influence the future development of what are, already, quite useful modules.
The other choice, and it's one we haven't done yet primarily because we haven't found that need, is to work with existing open-source modules and participate in the development process. Should one of those projects find its way into one of our websites, I expect that we'd do that. As an example, the Effority Workflow Text/HTML module is now an open source project. This module lacks the token replacement capability of the DotNetNuke Text/HTML module. If anyone is listening, adding token replacement would be a great addition! If you don't do it, we might ...