AWS Marketplace

Automating Channel Partner Resale Authorization using Amazon Web Services (AWS) Marketplace Catalog API

AWS Marketplace Private offers are a purchasing program that allows sellers and buyers to negotiate custom prices and end user licensing agreement (EULA) terms for software purchases in AWS Marketplace. AWS Marketplace Channel partner private offers (CPPO) allow independent software vendors (ISVs) to grant channel partners (CPs) the authority to resell their products on their behalf on the AWS Marketplace.

Channel partners need to first obtain a resale authorization (also known as resell opportunity) from the ISV for the product they intend to resell. This authorization is either for a one-time use or for multiple uses, depending on the agreements in place between the ISV (seller) and channel partner (reseller). Once channel partners secure the resale authorization, they are able to start a negotiation with the customer, and eventually create a private offer (PO). The customer can then procure the selected product through the AWS Marketplace.

Both sellers and channel partners can benefit from integrating the lifecycle of resale authorization and private offers into their quoting and ordering processes. This post will show you how the adoption of AWS Marketplace Catalog Application Programming Interfaces (CAPI) is a transformative solution which alleviates pain points and increases the efficiency of the ISV-CP relationship, by automating the process of granting resale authorizations and creating private offers.

Figure 1 – High level view of channel partner private offer relationships

Prerequisites

To be able to automate resale authorizations via AWS Marketplace Catalog API, you must meet the following prerequisites:

  1. You are a registered seller (ISV) or channel partner on AWS Marketplace
  2. You have set up the custom IAM role as described in the Create an IAM role section of the AWS Marketplace Catalog API reference
  3. As a seller, you have identified the product (or the list of products) that you want to authorize your channel partner(s) to re-sell
  4. As a seller, you have agreements in place with one or more resellers to resell such products
  5. As a reseller, you have agreements in place with one or more ISV (seller) to resell their product(s)

AWS Marketplace Catalog API introduction

The AWS Marketplace Catalog API (CAPI) service provides an API to manage AWS Marketplace for your AWS organization or AWS account. Anything that sellers or channel partners own in AWS Marketplace are Entities. A resale authorization is represented as an Entity object. When using CAPIs, entities are created, updated, released and restricted by submitting a Change.

A collection of one or more Changes is grouped into a ChangeSet. ChangeSets are submitted as a JSON body of a StartChangeSet API request. Upon successful submission, the change request is processed asynchronously and a ChangeSetId is returned for tracking purposes. You can check the status of the changeset through the AWS Marketplace Management Portal or by sending a DescribeChangeSet API request. Once a changeset has been successfully completed, DescribeChangeSet will return an Entity object, which can be used to apply further changesets or to get information about the status of the entity by means of DescribeEntity API request.

Figure 2 – ChangeSet process flow

In order to create and publish a resale authorization via CAPI, an AWS Marketplace seller needs to submit the following change requests:

  1. Create a resale authorization via a CreateResaleAuthorization Change object. As a result of a successful execution, a resale authorization is created in Draft state. While in this state, the resale authorization is not visible to any reseller.
  2. Update the draft resale authorization and apply resell conditions granted to the channel partner. For a resale authorization to be subsequently released to a channel partner an UpdatePricingTerms Change object must be applied to the resale authorization.
  3. Further customizations are optional and can be applied by means of other ChangeTypes.
  4. Release the resale authorization using a ReleaseResaleAuthorization Change Object. After a release authorization is released, it becomes visible to the target channel partner.

Figure 3 – Resale authorization release process

Streamlining the resale authorization process for sellers

In the following, we will be looking at some practical use cases to help streamlining the resale authorization process for AWS Marketplace sellers. All code samples provided below are available at the AWS Marketplace Catalog API Reference Code Library repository. For sake of brevity, we will only reference the JSON body of the API requests. Full working Python samples are available at the repository.

Automating standard resale authorization and performing bulk changes

With channel partner private offers, ISVs have the option to provide resale authorization for single or multiple uses. Multiple uses can be unlimited (until the resale authorization is revoked), or can be limited in time and/or number of private offers. As an example, an ISV could provide all its channel partners with a standard discount for a set of its products. Using the AWS Marketplace Management Portal, the ISV would need to manually create a new resale authorization every time a channel partnership agreement is signed. With CAPIs, the creation of an unlimited resale authorization can be streamlined and embedded in the ISV partnership processes.

We will analyze in details the ChangeSet contained in the multiuse_resaleauth_no_expirydate_cppo use case example in the AWS Marketplace Catalog API Reference Code Library repository. When submitted via StartChangeSet API request, this ChangeSet will create a resale authorization for the reseller with AWS Account id 111111111111 to resell an AMI Product, corresponding to ProductId prod-1111111111111, with hourly annual pricing and a custom End User License Agreement (EULA). The resell authorization has no expiry date. The ChangeSet contains the following changes.

  1. CreateResaleAuthorization creates the Draft resale authorization. The authorization must be targeted to a specifc reseller, identified by ResellerAccountId. If no ProductId is specified, the authorization is valid for all products listed by the seller. If this was the only Change in the Set, we would need to wait for its execution to be completed and retrieve the Entity Identifier of the resale authorization before submitting further changes. When multiple changes are grouped in a single Set, we can provide a ChangeName and reference the result of this Change in the following one. In this sample, we specify ResaleAuthorization as the ChangeName. We are then able to reference the Identifier of the created entity as $ResaleAuthorization.Entity.Identifier in the following Changes.
  2. With ReleaseResaleAuthroization,we publish the resale authorization to the reseller. It’s worth noting that, even if this request is listed as the second Change object, it will be executed as the last change. The AWS Marketplace Catalog API service applies all the changes to the same resale authorization included in this set before publishing the authorization.
  3. UpdatePricingTerms specifies the pricing terms specific to this resale authorization.
  4. Finally with UpdateLegalTerms we provide specific buyer terms that are applicable to this authorization.
{
    "catalog": "AWSMarketplace",
    "changeSet": [
        {
            "ChangeType": "CreateResaleAuthorization",
            "ChangeName": "ResaleAuthorization",
            "Entity": {
                "Type": "ResaleAuthorization@1.0"
            },
            "DetailsDocument": {
                "ProductId": "prod-1111111111111",
                "Name": "TestResaleAuthorization",
                "Description": "Worldwide ResaleAuthorization",
                "ResellerAccountId": "111111111111"
            }
        },
        {
            "ChangeType": "ReleaseResaleAuthorization",
            "Entity": {
                "Type": "ResaleAuthorization@1.0",
                "Identifier": "$ResaleAuthorization.Entity.Identifier"
            },
            "DetailsDocument": "{}"
        },
        {
            "ChangeType": "UpdatePricingTerms",
            "Entity": {
                "Type": "ResaleAuthorization@1.0",
                "Identifier": "$ResaleAuthorization.Entity.Identifier"
            },
            "DetailsDocument": {
                "PricingModel": "Contract",
                "Terms": [
                    {
                        "Type": "ResaleConfigurableUpfrontPricingTerm",
                        "CurrencyCode": "USD",
                        "RateCards": [
                            {
                                "Selector": {
                                    "Type": "Duration",
                                    "Value": "P12M"
                                },
                                "RateCard": [
                                    {
                                        "DimensionKey": "t2.small",
                                        "Price": "150"
                                    }
                                ],
                                "Constraints": {
                                    "MultipleDimensionSelection": "Allowed",
                                    "QuantityConfiguration": "Allowed"
                                }
                            }
                        ]
                    }
                ]
            }
        },
        {
            "ChangeType": "UpdateLegalTerms",
            "Entity": {
                "Type": "ResaleAuthorization@1.0",
                "Identifier": "$ResaleAuthorization.Entity.Identifier"
            },
            "DetailsDocument": {
                "Terms": [
                    {
                        "Type": "BuyerLegalTerm",
                        "Documents": [
                            {
                                "Type": "CustomEula",
                                "Url": "https://s3.amazonaws.com/sample-bucket/custom-eula.pdf"
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

Should the pricing terms for channel partners change, all the resale authorization will have to be revoked, and new ones will need to be created for all the channel partners. By using the RestrictResaleAuthorization changeset, ISVs can bulk revoke the previously granted authorization. The changeset included in the restrict_resale_authorization sample restricts the resale authorization whose Entity Identifier is resaleauthz-1111111111111.

{
    "catalog": "AWSMarketplace",
    "ChangeSet": [
        {
            "ChangeType": "RestrictResaleAuthorization",
            "Entity": {
                "Type": "ResaleAuthorization@1.0",
                "Identifier": "resaleauthz-1111111111111"
            },
            "DetailsDocument": {}
        }
    ]
}

A restricted resale authorization can no longer be used by a channel partner to create a private offer. However, this change will not impact any of the existing private offers. After revoking the existing authorizations, ISVs can provide new ones to their channel partners as discussed earlier.

Ensuring consistency for customized resale authorizations

The AWS Marketplace Catalog API grants ISVs the same flexibility that is available through the AWS Marketplace Management Portal. Other than providing special pricing terms, ISVs have the capability to generate Resale Authorizations tailored to other reseller specific needs, such as custom payment schedules and legal terms. Such specific resale authorizations can be provided as single or multi use and can also be limited to specific buyers. In order to authorize these special conditions to a reseller, sellers are typically going through an internal approval process. Once the conditions are approved, ISVs that are using only the AMMP need to access the portal and create the resale authorization.

By integrating CAPIs into their approval process, ISVs can automate the resale authorization grant even for these special cases. As we have shown earlier in this post, resale authorizations are initially created in Draft state and are not visible to the reseller until they get published. This allows for segregation of responsibilities where the resale authorization can be created by the ISV ordering system and submitted to the approval process. Once approved, the resale authorization can be automatically published to the channel partner. By following this approach, the resulting resale authorization aligns precisely with the intended resale strategy, reducing ambiguity and potential errors.

Figure 4 – Resale authorization creation in multiple steps

Build Your Own Resell Authorization Dashboard.

Both sellers and channel partners can retrieve the list of resale authorizations by sending a ListEntities API request. Such list can be retrieved by setting EntityType to ResaleAuthorization in the JSON body of the POST request. Furthermore, the ListEntities API supports filtering by adding an OfferFilters object as part of the POST body. As an example, a channel partner could get the list of the received resale authorizations which can be used to create a CPPO by limiting the request to those with OfferExtendedStatus equal to Completed-Usable.

Both sellers and channel partners can get details about resale authorizations by sending a DescribeEntity API request. On top of details about the terms and applicability of the authorization, the output of the request provides information about its actual usage, i.e. whether the resale authorization was used by the channel partner to create one or more private offers. For the sake of brevity, we are omitting details of the authorization and highlighting only the ones relevant to track usage in the following example of a DescribeEntity API request result.

{
  "EntityType": "ResaleAuthorization@1.0",
  "EntityIdentifier": "resaleauthz-111111111",
  "DetailsDocument": {
    "Name\": "TestResaleAuthorization\",

    "OfferDetails": {
      "OfferExtendedStatus": "Completed-Usable",

      "OfferCreatedCount": "2"
    },

  },
}

This opens a possibility for ISVs to surface resale authorization details into their Customer Relationship Management (CRM) or business intelligence (BI) tools, or to create dedicated dashboards to provide insights into the status of Resale Authorizations issued so far. Such a dashboard would enable ISVs to monitor the utilization of the resale authorizations by channel partners, facilitating better oversight and management of the reselling process. It allows ISVs to stay informed about which partners are actively utilizing their authorization and which might need additional support or engagement.

At the same time, the insights retrievable via DescribeEntity API request offer the opportunity for channel partners to develop their own dashboards as well. These dashboards serve as command centers, helping channel partners to efficiently track and manage Resale Authorizations received from various ISVs. This centralized view allows channel partners to stay organized, ensuring that they don’t overlook critical resale authorization details and deadlines.

Furthermore, channel partners can extend their internal dashboards to include features that track the creation of Channel Partner Private Offers (CPPOs) using Resale Authorizations and provide insights into corresponding agreements when end buyers accept offers. The ability to automate CPPO creation through private offer workflows enhances the channel partners’ operational efficiency and reduces manual effort.

Conclusion

The AWS Marketplace Catalog API service offers a transformative solution to improve both ISVs and CPs experiences in reselling products on the AWS Marketplace. By automating and streamlining the authorization workflow, enhancing customization options, and providing comprehensive tracking capabilities, APIs pave the way for a more efficient and collaborative partnership between ISVs and their channel partners. This innovation simplifies the process, enhances transparency, and enables better decision-making, and resource allocation for all parties involved.

We recommend the reader to consult the AWS Marketplace Catalog API Reference Code Library repository, which contains code samples for other use cases that streamline ISV and channel partner operations.

About Authors

Gianluca Vegetti

Gianluca Vegetti is a Senior Enterprise Architect in the AWS Partner Organization aligned with Strategic Partnership Collaboration and Governance (SPCG) engagements. In his role, he supports the definition and execution of Strategic Collaboration Agreements with selected AWS partners.

Ming Zhu

Ming Zhu is a System Development Engineer in the AWS Partner Solution Integrations team. Her responsibilities focus on providing coding integrations for AWS partners. Besides work, her favorite things to do are swimming, traveling and cooking.

Tuan Vo

Tuan Vo is a Marketplace Specialist Solutions Architect who focuses on supporting sellers to list their products on AWS Marketplace. He supports large enterprises and public sector customers. Outside of work, Tuan enjoys traveling, trying out new food, and going on walks.

Tasrin Amin

Tasrin Amin is a Technical Program Manager in the AWS Marketplace. She manages ISV and SI partner integration programs which provide customers with greater visibility into partner solutions in AWS service consoles. In her free time, she likes to visit US National and State Parks, binge watches TV shows, and travels with her friends and family.