Offer a Period of Free Service for Reactivating a Subscription

Overview

This guide shows you how to implement the Reinstate Subscription Items and Update Next Billing Date endpoints to offer a customer a free access period when reactivating a deactivated subscription.

Use case

  1. Cloudify wants to win back customers who canceled their Cloudify Enterprise subscriptions.
  2. Cloudify emails former customers with an offer of two free months if they reactivate their subscriptions.
  3. The customer clicks the reactivation link and confirms the reactivation on a Cloudify-hosted page.
  4. The page uses the Reinstate Subscription Items endpoint to reactivate all subscription items and the Update Next Billing Date endpoint to delay billing for two months.

Result

The Cleverbridge platform reactivates the subscription immediately and resumes recurring billing after the free access period ends.

Implement API endpoints

Before you start

Make sure that:

  • All subscription items have the status Deactivated.
  • Each subscription item to be reactivated belongs to an active subscription product.
  • The new next billing date is set in the future. If the billing date should be set to today, set it at least one minute in the future.
  • The customer has agreed to the reactivation offer and future billing after the free access period.
🚧

Important

Get the customer's consent before making changes to a subscription.

To avoid chargebacks and customer inquiries, it is also essential that you coordinate all price increases with Client Experience.

In the European Economic Area (EEA), Strong Customer Authentication (SCA) is required for recurring electronic payments when the amount changes. This means that some of your customers will have to authenticate their payment, which in turn might impact the renewal success rate.

For more information, see Best Practices: Obtain Customer Consent.


Step 1: Reinstate the subscription items

Use the Reinstate Subscription Items endpoint to reactivate all subscription items.

Parameters

ParameterTypeRequiredExampleNotes
SubscriptionIdstrYesS67458907The unique identifier of the subscription.
Itemsarray[int]Yes[1,2]Array of subscription item running numbers to reactivate.

Request

curl --location 'https://rest.cleverbridge.com/subscription/reinstatesubscriptionitems' 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Authorization: Basic YOUR_BASE64_ENCODED_CREDENTIALS' 
--data '{
    "Items": [
        1,
        2
    ],
    "SubscriptionId": "S67458907"
}'
import http.client
import json

conn = http.client.HTTPSConnection("rest.cleverbridge.com")
payload = json.dumps({
  "Items": [
    1,
    2
  ],
  "SubscriptionId": "S67458907"
})
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Basic YOUR_BASE64_ENCODED_CREDENTIALS'
}
conn.request("POST", "/subscription/reinstatesubscriptionitems", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://rest.cleverbridge.com/subscription/reinstatesubscriptionitems',
  'headers': {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Basic YOUR_BASE64_ENCODED_CREDENTIALS'
  },
  body: JSON.stringify({
    "Items": [
      1,
      2
    ],
    "SubscriptionId": "S67458907"
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
Unirest.setTimeouts(0, 0);
HttpResponse<String> response = Unirest.post("https://rest.cleverbridge.com/subscription/reinstatesubscriptionitems")
  .header("Content-Type", "application/json")
  .header("Accept", "application/json")
  .header("Authorization", "Basic YOUR_BASE64_ENCODED_CREDENTIALS")
  .body("{\n    \"Items\": [\n        1,\n        2\n    ],\n    \"SubscriptionId\": \"S67458907\"\n}")
  .asString();

JSON Body

{
    "Items": [
        1,
        2
    ],
    "SubscriptionId": "S67458907"
}

Response

{
    "ResultMessage": "OK"
}

Step 2: Update the next billing date

Use the Update Next Billing Date endpoint to delay billing until the free access period ends.

Parameters

ParameterTypeRequiredExampleNotes
SubscriptionIdstrYesS67458907The unique identifier of the subscription.
NextBillingDatedatetimeYes2026-08-13T12:01:00ZThe new billing date after the free access period. Must be in the future.

Request

curl --location 'https://rest.cleverbridge.com/subscription/updatenextbillingdate' 
--header 'Content-Type: application/json' 
--header 'Accept: application/json' 
--header 'Authorization: Basic YOUR_BASE64_ENCODED_CREDENTIALS' 
--data '{
  "NextBillingDate": "2026-08-13T12:01:00Z",
  "SubscriptionId": "S67458907"
}'
import http.client
import json

conn = http.client.HTTPSConnection("rest.cleverbridge.com")
payload = json.dumps({
  "NextBillingDate": "2026-08-13T12:01:00Z",
  "SubscriptionId": "S67458907"
})
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Basic YOUR_BASE64_ENCODED_CREDENTIALS'
}
conn.request("POST", "/subscription/updatenextbillingdate", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
var https = require('follow-redirects').https;
var fs = require('fs');

var options = {
  'method': 'POST',
  'hostname': 'rest.cleverbridge.com',
  'path': '/subscription/updatenextbillingdate',
  'headers': {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Basic YOUR_BASE64_ENCODED_CREDENTIALS'
  },
  'maxRedirects': 20
};

var req = https.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function (chunk) {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });

  res.on("error", function (error) {
    console.error(error);
  });
});

var postData = JSON.stringify({
  "NextBillingDate": "2026-08-13T12:01:00Z",
  "SubscriptionId": "S67458907"
});

req.write(postData);

req.end();
Unirest.setTimeouts(0, 0);
HttpResponse<String> response = Unirest.post("https://rest.cleverbridge.com/subscription/updatenextbillingdate")
  .header("Content-Type", "application/json")
  .header("Accept", "application/json")
  .header("Authorization", "Basic YOUR_BASE64_ENCODED_CREDENTIALS")
  .body("{\n  \"NextBillingDate\": \"2026-08-13T12:01:00Z\",\n  \"SubscriptionId\": \"S67458907\"\n}")
  .asString();

Response

{
    "ResultMessage": "OK"
}

Diagram


flowchart LR
  classDef mainColor fill:#ffffff,color:#555555,stroke:#96C34B,stroke-width:2px;

  A(["&nbsp;&nbsp;<br/><b>Reactivation Offer</b><br/>Cloudify offers former customers two free months: The customer accepts the offer&nbsp;&nbsp;<br/>&nbsp;"]):::mainColor
    --> B(["&nbsp;&nbsp;<br/><b>Subscription Reactivated</b><br/><i>Reinstate Subscription Items</i> endpoint used&nbsp;&nbsp;<br/>&nbsp;"]):::mainColor
    --> C(["&nbsp;&nbsp;<br/><b>Billing</b><br/>The <i>Update Next Billing Date</i> endpoint is used to move the next billing date&nbsp;&nbsp;<br/>&nbsp;"]):::mainColor