SaaS Offer: "Upgrade to Paid" button not working

Aniruddha Joshi 20 Reputation points
2026-06-22T13:01:37.3066667+00:00

I am testing a SaaS offer in Azure Marketplace using a Preview offer.
The offer has two plans:

  • PAYG (paid, no free trial)
  • azure-plan (1-month free trial, then automatically becomes paid)

I subscribed to the azure-plan and noticed an "Upgrade to paid" option in the Azure Portal as shown in the image -
User's image

My assumption was that clicking this button would immediately end the free trial and convert the subscription to the paid version of the same plan.

When I clicked the button, Azure Marketplace sent a CHANGE_PLAN webhook to my SaaS fulfillment endpoint. In the webhook payload, both the current plan ID and the target plan ID appeared to be the same (azure-plan). My backend processed the request successfully and returned a successful response.

However, approximately two minutes later, Azure Marketplace invoked the webhook again for the same operation, and the Azure Portal displayed the following error:
The subscription upgrade has failed and the subscribed plan is still azure-plan - 1-month subscription. Reason for failure: ErrorCode: BadRequest. ErrorDetails: {"code":"InvalidInput","message":"Line item ..... is already in for SkuId ..... and cannot be converted to it."}.

My questions are:

  1. What is the intended behavior of the "Upgrade to Paid" button for a SaaS plan that includes a free trial?
  2. How do I resolve this error?

Any documentation describing the behavior of the "Upgrade to paid" button and the expected SaaS Fulfillment API flow would also be appreciated.

Azure | Azure ISV (Independent Software Vendor)
0 comments No comments

Answer accepted by question author

Jerald Felix 17,640 Reputation points Volunteer Moderator
2026-06-25T15:43:42.9433333+00:00

Hello Aniruddha Joshi,

Greetings! Thanks for raising this question in the Q&A forum.

The behavior you are seeing is expected up to a point, and then it runs into a genuine platform side limitation rather than something wrong in your webhook handler.

  1. Intended behavior of "Upgrade to Paid"

This button is meant to end the free trial early and start billing immediately for the same plan, it is not meant to move the customer to a different plan or a different SKU. A trial and its paid continuation share the same plan ID, the only thing that changes is the isFreeTrial flag and the billing start date. This is why Marketplace sends a CHANGE_PLAN webhook with the same plan ID on both sides, from the platform's point of view ending a trial early is technically modeled as a plan operation even though the plan itself does not change. This answers your first question, your assumption was correct, it should immediately end the trial and convert to paid for the same azure-plan.

  1. Why your webhook handling is not the problem

Since the source and target plan IDs are identical, there is nothing for your fulfillment service to actually change on its own side, the correct response is to accept the operation and call the Update Status of Operation API with a success status without attempting any internal plan migration logic, since none is needed. You already did this and your backend returned success correctly.

  1. Where the actual failure is happening

The error message you are seeing, Line item ... is already in for SkuId ... and cannot be converted to it, is generated by Microsoft's own commerce backend when it tries to finalize the early trial to paid conversion at the billing layer, not by anything your webhook returned. This is the same validation rule documented for the Change Plan API where the target plan being identical to the current plan is treated as a bad request, except here it is Microsoft's own internal call hitting that same validation rather than a call you made. This points to the early trial conversion flow for the "Upgrade to paid" button not being fully wired through for this specific combination, and since you are testing this on a Preview offer, this kind of edge case in early trial termination is more likely to surface before an offer goes live.

  1. What to do next

Since this failure originates in Microsoft's backend and is not something a publisher side webhook fix can resolve, you will need to escalate this through Partner Center support so the Marketplace engineering team can look directly at the failed operation.

Partner Center > Support > New support request
Category: Marketplace offers
Subcategory: SaaS technical issues

Include the subscription ID, the publisher ID and offer ID, the plan ID azure-plan, the approximate timestamp of the failed upgrade attempt, and the exact error text shown in the portal, this lets the engineer pull the operation record on their side and confirm whether this is a known issue with early trial termination on Preview SaaS offers.

  1. Workaround while this is being investigated

Until this is resolved, avoid relying on customers clicking "Upgrade to paid" mid trial for this offer, since the conversion will keep failing at the platform layer regardless of how your webhook responds. The automatic conversion that happens naturally at the end of the trial period should still work normally, since that is a different internal flow than the explicit early upgrade action.

If this answer helps you kindly accept the answer which will help others who have similar questions.

Best Regards,

Jerald Felix

Was this answer helpful?

1 person found this answer helpful.
0 comments No comments

0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.