This paper describes basic architectures and best practices for implementing software as a service application. In this context, achieving good margins requires making careful engineering trade-offs between adding features and lowering total cost of ownership. Achieving good system utilization requires that businesses share resources using either virtual machines (OS-level virtualization) or multi-tenancy (application-level virtualization). While multi-tenancy achieves greater levels of consolidation, it limits the kinds of features that can be provided. Thus the ideal level for virtualization depends on the characteristics of the application and its users.