Questions? Check out our FAQ!
Mona SaaS is a [M]arketplace [On]boarding [A]ccelerator designed to make it easier for Microsoft's ISV partners to rapidly onboard transactable SaaS solutions to Azure Marketplace and AppSource. It includes lightweight, reusable code modules that ISVs deploy in their own Azure subscription, and low/no-code integration templates featuring Azure Logic Apps.
Mona SaaS implements all of the various customer and publisher (you, the ISV) flows that are required by Microsoft's SaaS fulfillment APIs including both the landing page that customers will see when purchasing your SaaS offer and the webhook that Azure Marketplace uses to notify you of subscription changes like cancellations and suspensions.
Each of these operations is exposed to your SaaS application by Mona SaaS through events published to a custom Event Grid topic automatically provisioned during setup. By default, Mona SaaS deploys a set of "stub" Logic Apps into your Azure subscription that are enabled by default and configured to be triggered by these subscription events.
Since Mona SaaS exposes these subscription-related events to your SaaS application through an Event Grid topic, you have lots of options for handling them. Because Mona SaaS is using Event Grid, multiple event subscribers can handle the same events simultaneously. These flows can be easily modified in production with no downtime.
First, ensure that the following prerequisites are met.
- You have an active Azure subscription. If you don't already have one, get one free here.
- You have the ability to create new app registrations within your Azure Active Directory (AAD) tenant. In order to create app registrations, you must be a directory administrator. For more information, see this article.
- You have the ability to create resources and resource groups within the target Azure subscription. Typically, this requires at least contributor-level access to the subscription.
Navigate to the Azure portal and launch the Bash cloud shell.
If this is the first time that you've used the cloud shell, you will be prompted to create or choose an existing an Azure Files share.
Run this command from the cloud shell to clone the Mona SaaS repository —
git clone https://github.com/microsoft/mona-saas
By default, the Mona SaaS repository will be cloned to a local directory named mona-saas
. Navigate to the setup folder by running the following command —
cd ./mona-saas/Mona.SaaS/Mona.SaaS.Setup
Finally, enable the setup script to be executed locally by running —
chmod +x ./basic-deploy.sh
At a minimum, you need this information before running the setup script —
- The Azure region in which you wish to deploy Mona SaaS.
- For a complete list of available regions, run
az account list-locations -o table
from the cloud shell. Be sure to use the region'sName
, notDisplayName
orRegionalDisplayName
.
- For a complete list of available regions, run
- An arbitrary, globally-unique name for this Mona deployment.
- This identifier must consist of lowercase alphanumeric characters (a-z, 0-9) only.
- It must also be between 3 and 13 characters in length.
- A friendly display name for your Mona deployment which your customers will see when authenticating to the landing page that Mona SaaS deploys. Although a display name isn't technically required, it's highly recommended.
To deploy a Mona instance named monaex01
to the West Europe (westeurope
) Azure region, you would run the following command from the cloud shell. Note that, since you didn't explicitly provide a display name, Mona will default to using monaex01
as the display name.
./basic-deploy.sh -r "westeurope" -n "monaex01"
To include the display name Mona Example 01
explicitly, your would run —
./basic-deploy.sh -r "westeurope" -n "monaex01" -d "Mona Example 01"
The setup script supports additional optional parameters detailed in the table below. For example, if you wish to deploy Mona into a specific Azure subscription (9897b07c-86fa-4779-92e3-6273664ec722
) and resource group (monaex01group
), you can run —
# Broken down into multiple lines for readability...
./basic-deploy.sh \
-r "westeurope" \
-n "monaex01" \
-d "Mona Example 01" \
-g "monaex01group" \
-s "9897b07c-86fa-4779-92e3-6273664ec722"
Switch | Name | Required | Default | Notes |
---|---|---|---|---|
-n |
Deployment name | Yes | N/A | A user-defined, globally-unique name for this Mona SaaS deployment. The deployment name must contain only alphanumeric characters and be 13 characters in length or less. |
-r |
Deployment region | Yes | N/A | The Azure region to which Mona SaaS should be deployed. For a complete list of available regions, run az account list-locations -o table from the Azure CLI (Bash cloud shell). Be sure to use the region's Name , not DisplayName or RegionalDisplayName . |
-d |
Display name | No | Same as deployment name (-n ) |
A "friendly" display name for this Mona SaaS deployment. If provided, this is also the name of the Azure Active Directory (AAD) app created during setup. While providing this parameter isn't required, it's highly recommended. |
-a |
Existing App Service plan ID | No | N/A | The complete resource ID (i.e., /subscriptions/{subscriptionId}/... ) of an existing App Service plan to publish the Mona web app to. If provided, the App Service plan must exist in the same region (see -l ) and Azure subscription (see -s ) where Mona is being deployed. If not provided, the setup script will automatically provision a new App Service plan (S1) within the same resource group (see -r ) where Mona is being deployed. It must also be a Windows-based App Service plan. |
-g |
Deployment Azure resource group name | No | mona-[deployment name (-n)] |
The Azure resource group to deploy Mona SaaS into. If the resource group already exists, it must be empty. If the group doesn't exist, it will be automatically created during setup. |
-s |
Deployment Azure subscription ID | No | The current subscription | The ID of the Azure subscription to deploy Mona SaaS into. |
-e |
Subscription event version identifier | No | Current (2021-10-01 ) |
When set, specifies the version of subscription events Mona should publish. Learn more here. |
-h |
Flag - Don't show script splash screen. | No | N/A | When set, the setup script will not display the standard Mona setup splash screen. |
-p |
Flag - Don't publish the web app. | No | N/A | When set, the setup script will provision all Azure and Azure Active Directory reources as usual but won't actually publish the Mona web app. |
Once the script is finished, note the information provided in the Mona Deployment Summary
. It's strongly recommended to save these values somewhere safe and convenient as you will likely need to refer to them again later.
Locate the setup URL at the very bottom of the script output. It will look similiar to this —
https://mona-web-monaex01.azurewebsites.net/setup
# Where "monaex01" is the Mona deployment name.
Click the URL (it's automatically linked within the cloud shell) to navigate to that site and complete the Mona SaaS setup wizard.
The setup wizard is hosted entirely within your own Mona SaaS deployment so you're aren't sharing any information with Microsoft (or anyone else) at this point.
Use the Partner Center to configure your offer(s) and begin transacting with Microsoft!
Mona SaaS is open source (see our license) and free to use.
Since Mona SaaS is deployed into your Azure environment, the only costs that you're responsible for are those of hosting its supporting Azure resources. These resources include —
- An S1 (Standard) App Service Plan (Pricing)
- Note that you can deploy Mona SaaS to an existing Windows-based App Service Plan using the
-a
setup script parameter.
- Note that you can deploy Mona SaaS to an existing Windows-based App Service Plan using the
- An Event Grid topic (Pricing)
- Six (6) independent Azure Logic Apps preconfigured to handle different types of Marketplace events (Consumption Plan | Pricing)
- A Basic Integration Account (Pricing)
- A locally-redundant (LRS) standard (GPv2) storage account (Pricing)
- Application Insights (Pricing)
Note that free services are not included in this list.
Your actual costs may vary based on the following —
- The integrations that you build. For example, Logic Apps offers a growing list of Standard and Enterprise connectors that allow you to easily access various cloud-based and on-premises services. The connectors that you use have a direct impact on your overall Azure costs outside of the base Mona SaaS deployment.
- Where you deploy Mona SaaS. Be aware that costs for the same Azure services can vary across regions.
- Any special pricing arrangements you have with Microsoft. Many of the ISVs that Mona SaaS team works with have special pricing arrangements through their partnerships with Microsoft.
Use the Azure pricing calculator to better understand your unique costs.
For help in forecasting your Mona SaaS costs see this article.
Mona SaaS takes a dependency on the open source Commercial Marketplace .NET Client (commercial-marketplace-client-dotnet
). This library's DLL is conveniently included in the Mona SaaS repository.
All other dependencies are automatically satisfied using Nuget during the Mona SaaS setup process. For more information on Mona SaaS' dependencies, check out our dependency graph.
Please see our support docs for more information.
Please see our security docs for more information.
- The deployment name (
-n
setup script switch) mentioned in this section must be globally unique.
Please refer to these docs for more information.
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft's Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.