Provisioning your Customer

Congratulations! Your customer has signed the contract and they’re excited to get started. It’s the first important moment of that customer’s experience and one of the riskiest. With RevOps Account Activation API, we make it easy for you to onboard and activate customers quickly, easily, and consistently.

In this guide, we'll focus on the account provisioning and entitlement activation process. We'll configure your RevOps account with SKUs and Feature Flags to simplify this process for your Sales Rep and use webhooks to integrate entitlement activation into your applications and the other tools your team uses.

Let's get started!

Requirements for this Guide

  1. The developer role in your RevOps Console
  2. At least one Deal in your system
  3. The ability to receive an incoming HTTP request and process JSON

Step 1. Create Entitlements

Once your customer has signed your deal, you need to make sure the products and features sold on the contract make their way into your application. This starts with making sure that your SKUs are set up so that when the deal has been signed, we know what entitlements belong to your customer's Account.

Before we go any further, we need to understand how your product is sold:

  • Your product is sold as a single package - we see this when you buy a software license and have access to all its features for a given time period.
  • Your product has specific features that are sold individually - when a product has certain features or services that can be added to customize your product offering for particular customers. This may not be just within the product but also include Premium Support, consulting hours, or a variety of other options.

When your product is sold as a single package, that's the easiest approach. All you'll need to do is set up your SKUs in RevOps and map them into your products.

However, if you choose to set up feature-based entitlements for a particular product, you'll want to use Feature Flags. A Feature Flag is attached to a SKU and lets you map individual invoice line items to the capabilities you will activate for customers.

To keep things simple, let's start with the single package approach.

Step 2. Receive Entitlements

Now that we know what a customer is entitled to, we need to know when the Deal is closed so we can activate the customer. RevOps communicates to your system in real-time via Deal Webhook.

Deal Webhook

The Deal Webhook is fully described in the Webhooks section but the short explanation is that RevOps will fire a webhook every time a Deal changes status. This allows us to keep a complete audit log of every change. For activating entitlements, we'll focus on when all the signatures have been completed.

Configuring your Webhook

To receive and process that webhook request, we need to tell RevOps where to broadcast it. To set up Webhooks, you'll need the 'Developer' role on your RevOps account.

Webhooks under the hood
  1. Log in to your RevOps account.
  2. Go to Developer > Webhooks
  3. Create a new webhook endpoint by clicking Add New Webhook
  4. Fill in a Name. You can choose anything you like.
  5. In the Event Type dropdown, select Deals
  6. For the Callback URL, set your application URL which will receive and process the JSON
  7. Click Save.

Your webhook is now live and all Deal updates will generate requests to your server.

Testing your Webhook

But let's confirm everything is working as expected. To test this, we could edit any Deal in the system but we don't want to accidentally change something, so let's generate a test request.

  1. Visit your Deal Desk to retrieve a specific Deal Id. This is in the URL and looks something like cc3ad2d6-0de7-4ae3-bf73-db8023ba2ec3
  2. Copy that value into the Test with Deal Id on the webhook you just created
  3. Click Test Configuration

You should get a result similar to:

Webhooks Configuration

Step 3. Process Entitlements

Now that RevOps is broadcasting our completed Deals to our application, we have to parse the JSON sent to us and act on it. In the shortened version of the JSON below, there are three specific values we need: status, contract_activates_date, and skus.

First, the status value is signed so we know definitively that this Deal is valid and we can provision the customer.

Second, the contract_activates_date informs us when we should activate this customer. While this is often immediate, it could easily be on the first of the month.

Finally, the skus array tells us exactly which products to activate.

Now we can use our programming language of choice to iterate over the SKUs, create the customer's account in your systems, activate the products they expect, and notify your other teams of the new customer. The best part is that with automated provisioning, your customer can start faster, your teams will make fewer mistakes, and you can focus on your product.

{
  "body": {
    "event": {
      "id": "",
      "time": 1618376338,
      "type": "test-event"
    },
    "deal": {
      "id": "cc3ad2d6-0de7-4ae3-bf73-db8023ba2ec3",
      "billing_contact": {
        "name": null,
        "email": "",
        "title": "",
        "phone": null
      },
      "lead_contact": {
        "name": null,
        "email": null,
        "title": null
      },
      "contract_activates_date": "2/28/2021",
      "customer": {
        "domain": "",
        "legal_name": "Very Good Company",
        "opportunity_name": "My Great Project"
      },
      "net_price_currency": "USD",
      "net_price_precision": 2,
      "net_price": "5099.00",
      "opportunity_id": null,
      "original_net_price_currency": "USD",
      "original_net_price_precision": 2,
      "original_net_price": "5099.00",
      "signed_contract_url": null,
      "skus": [
        {
          "id": "1a37c25a-8a70-4d13-b42c-e21f38a39993",
          "friendly_name": "Enterprise Edition",
          "status": "active",
          "quantity": 1,
          "title": "Enterprise Edition",
          "description": null,
          "original_description": "Includes:\n - Unlimited Writers\n - Unlimited Collabrators \n - Custom Branding\n - Engagement Insights\n - Single Sign-On (SSO)",
          "unit_name": "Users",
          "billing_schedule": "year",
          "sku_group": "fixed-costs",
          "feature_flags": [],
          "unit_price": null,
          "unit_price_currency": "USD",
          "unit_price_precision": 2,
          "original_unit_price": "99.00",
          "original_unit_price_currency": "USD",
          "original_unit_price_precision": 2,
          "net_price": "99.00",
          "net_price_currency": "USD",
          "net_price_precision": 2,
          "original_net_price": "99.00",
          "original_net_price_currency": "USD",
          "original_net_price_precision": 2,
          "annual_price": "99.00",
          "annual_priceCurrency": "USD",
          "annual_pricePrecision": 2,
          "original_annual_price": "99.00",
          "original_annual_price_currency": "USD",
          "original_annual_price_precision": 2,
          "monthly_price": "8.25",
          "monthly_price_currency": "USD",
          "monthly_price_precision": 2,
          "original_monthly_price": "8.25",
          "original_monthly_price_currency": "USD",
          "original_monthly_price_precision": 2,
          "pricebook_id": null,
          "product_id": null,
          "product_code": null
        },
        {
          "id": "efc84d63-fa3b-4331-b33c-7ac7736aa8c5",
          "friendly_name": "Expert Setup & Training",
          "status": "active",
          "quantity": 1,
          "title": "Expert Setup & Training",
          "description": null,
          "original_description": "Get expert training and have our implementation specialists help you configure your account. This service includes help building your first journeys.",
          "unit_name": "Included",
          "billing_schedule": "one-time",
          "sku_group": "professional-services",
          "feature_flags": [],
          "unit_price": "5000.00",
          "unit_price_currency": "USD",
          "unit_price_precision": 2,
          "original_unit_price": "5000.00",
          "original_unit_price_currency": "USD",
          "original_unit_price_precision": 2,
          "net_price": "5000.00",
          "net_price_currency": "USD",
          "net_price_precision": 2,
          "original_net_price": "5000.00",
          "original_net_price_currency": "USD",
          "original_net_price_precision": 2,
          "annual_price": "0.00000000000000000000",
          "annual_priceCurrency": "USD",
          "annual_pricePrecision": 2,
          "original_annual_price": "0.00000000000000000000",
          "original_annual_price_currency": "USD",
          "original_annual_price_precision": 2,
          "monthly_price": "0.00000000000000000000",
          "monthly_price_currency": "USD",
          "monthly_price_precision": 2,
          "original_monthly_price": "0.00000000000000000000",
          "original_monthly_price_currency": "USD",
          "original_monthly_price_precision": 2,
          "pricebook_id": null,
          "product_id": null,
          "product_code": null
        }
      ],
      "status": "signed",
      "terms": [
        // terms are removed for brevity
      ],
      "feature_flags": [
        // if we had feature-level entitlements, this would have feature flags listed
      ]
    }
  },
  "contentLength": 8383,
  "headers": [
    {
      "key": "Content-Type",
      "value": "application/json"
    },
    {
      "key": "X-Revops-Content-Hmac",
      "value": "fd96ad6df15a4b1c26d8ef1698838564038fd185255c976b121085d2ddbb6a62"
    }
  ],
  "method": "post",
  "url": "https://8b70f19d2309.ngrok.io"
}