I am not 100% sure if you want to deliver different editions / language versions of your application, or if you want to install the same setup several times side-by-side. It sounds like you want to achive the latter. Let me try to briefly explain both scenarios.
First the basics:
- Package Code: identifies a unique MSI file (hence it should always change for each recompile)
- Product Code: identifies a unique product edition. Different flavors of the same product (such as english, german, french editions) tend to have different product codes.
- Upgrade Code: identifies a family of related products. In essence a group of product codes.
Different applications editions / languages: If what you want is to install a different language version of your setup - say you deliver English, French and German versions, you can do that by keeping the upgrade code the same for all of them, but use different product codes and package codes for each setup. This allows each setup to easily uninstall another if it is already present on the machine.
Side-By-Side installations: I don't like this concept since it tends to indicate an error in the setup design in my opinion, but the concept of "instance transforms" should be able to achieve what you probably refer to.
<InstanceTransforms Property="INSTANCEID">
<Instance Id="Install2" ProductCode="*"
UpgradeCode="guid-goes-here" ProductName="Product" />
</InstanceTransforms>
- Wix Documentation - Instance Element
- Authoring Multiple Instances with Instance Transforms
- Installing Multiple Instances with Instance Transforms
- A walkthrough in WIX (untested by me)
- How do Windows Installer instance transforms interact with upgrades?
- MSI/WiX - Assigning Component GUID's during Multiple Instance Transforms