Build Managed Application Offer
8 min
building the offer the deployment package to create a managed application offer you first build your solution in a repeatable deployment format azure uses arm templates to define the infrastructure deployed into the customer's environment you prepare a deployment package — a zip file containing two files at the root warning the deployment package must not contain binaries such as vm images reference all images from marketplace instead maintemplate json an arm template defining every azure resource that makes up your application — virtual machines, storage accounts, databases, networking and so on this template runs in the customer's subscription at deployment time file name casing matters the file must be named exactly \<font color="#b91c1c">`maintemplate json`\</font> , at the root of the zip validate before uploading run the arm template test toolkit (arm ttk) https //learn microsoft com/en us/azure/azure resource manager/templates/test toolkit against the package it checks the template, the parameters and the ui definition against marketplace requirements start from working samples there are public repositories with hundreds of samples azure managed app samples on github, https //github com/azure/azure managedapp samples the sample projects index https //learn microsoft com/en us/azure/azure resource manager/managed applications/sample projects and the broader azure quickstart templates https //azure microsoft com/resources/quickstart templates/ createuidefinition json the ui definition file drives the interface your customer sees in the azure portal during deployment it lets you ask for configuration inputs — instance name, sizing, admin credentials, optional settings — in a wizard the outputs of this form map one to one to the parameters of \<font color="#b91c1c"> maintemplate json \</font> file name casing matters the file must be named exactly \<font color="#b91c1c"> createuidefinition json \</font> , at the root of the zip preview it in the sandbox paste your file into the create ui definition sandbox https //portal azure com/#blade/microsoft azure createuidef/sandboxblade to preview the exact portal experience without deploying anything guide test your portal interface https //learn microsoft com/en us/azure/azure resource manager/managed applications/test createuidefinition reference docs createuidefinition overview https //learn microsoft com/en us/azure/azure resource manager/managed applications/create uidefinition overview with all supported elements and functions tip microsoft's free mastering the marketplace — azure managed applications https //microsoft github io/mastering the marketplace/azure app/ track has hands on labs and videos covering the whole package building process working example the end result of development is two json files, zipped together and uploaded in the wetransact portal depending on what you deploy, these files range from trivial to very large the example below deploys a single storage account with one blob container maintemplate json { "$schema" "https //schema management azure com/schemas/2019 04 01/deploymenttemplate json#", "contentversion" "1 0 0 0", "parameters" { "storageaccounttype" { "type" "string", "defaultvalue" "standard lrs", "allowedvalues" \[ "standard lrs", "standard grs", "premium lrs" ] }, "location" { "type" "string", "defaultvalue" "\[resourcegroup() location]" }, "containername" { "type" "string", "defaultvalue" "demo" } }, "variables" { "storageaccountname" "\[concat('demo', uniquestring(resourcegroup() id))]" }, "resources" \[ { "type" "microsoft storage/storageaccounts", "apiversion" "2025 06 01", "name" "\[variables('storageaccountname')]", "location" "\[parameters('location')]", "sku" { "name" "\[parameters('storageaccounttype')]" }, "kind" "storagev2", "properties" { "supportshttpstrafficonly" true, "minimumtlsversion" "tls1 2", "allowblobpublicaccess" false } }, { "type" "microsoft storage/storageaccounts/blobservices/containers", "apiversion" "2025 06 01", "name" "\[concat(variables('storageaccountname'), '/default/', parameters('containername'))]", "dependson" \[ "\[resourceid('microsoft storage/storageaccounts', variables('storageaccountname'))]" ], "properties" { "publicaccess" "none" } } ], "outputs" { "storageaccountname" { "type" "string", "value" "\[variables('storageaccountname')]" } } } this template takes three input parameters — \<font color="#b91c1c"> location \</font> , \<font color="#b91c1c"> storageaccounttype \</font> and \<font color="#b91c1c"> containername \</font> the customer supplies them through the azure portal ui, which is defined in \<font color="#b91c1c"> createuidefinition json \</font> note that the outputs of the ui definition below match the parameters of the template above createuidefinition json { "$schema" "https //schema management azure com/schemas/0 1 2 preview/createuidefinition multivm json#", "handler" "microsoft azure createuidef", "version" "0 1 2 preview", "parameters" { "basics" \[], "steps" \[ { "name" "storageconfig", "label" "storage", "elements" \[ { "name" "storageaccounttype", "type" "microsoft common dropdown", "label" "storage account type", "defaultvalue" "standard lrs", "tooltip" "redundancy/performance tier for the demo storage account ", "constraints" { "allowedvalues" \[ { "label" "standard lrs", "value" "standard lrs" }, { "label" "standard grs", "value" "standard grs" }, { "label" "premium lrs", "value" "premium lrs" } ], "required" true } }, { "name" "containername", "type" "microsoft common textbox", "label" "blob container name", "defaultvalue" "demo", "tooltip" "container created inside the storage account ", "constraints" { "required" true, "regex" "^\[a z0 9]\(\[a z0 9 ]{1,61}\[a z0 9])$", "validationmessage" "3 63 chars, lowercase letters, numbers and hyphens; must start and end with a letter or number " } } ] } ], "outputs" { "storageaccounttype" "\[steps('storageconfig') storageaccounttype]", "containername" "\[steps('storageconfig') containername]", "location" "\[location()]" } } } tip if you do not have the in house engineering capacity to build the package, wetransact's partner cloudsoft creates, tests and implements managed application packages see c loudsoft io/partners/wetransact https //cloudsoft io/partners/wetransact uploading and publishing with wetransact in the wetransact portal, create the managed application listing and complete the product description, media and plans — the same flow as any other listing upload the \<font color="#b91c1c"> zip \</font> package in the plan, in the field " zip file containing maintemplate json and createuidefinition json files" \[screenshot 02 portal add zip file png — the add zip file control in the media section of the listing] then click validate if everything is good, the validation will succeed if not, you will see an error message it’s recommended to run the validation yourself as well publish initial publication of a managed application offer typically takes up to 24 hours to go live, and republishing an update takes about as long this is slower than saas because microsoft performs a manual certification pass on the template files \[to confirm — the 24 hour figure is wetransact's observed experience, not a documented microsoft sla ] 💬 for more, contact us at \<font color="#a855f7">\</font>