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
- Cloudify wants to win back customers who canceled their Cloudify Enterprise subscriptions.
- Cloudify emails former customers with an offer of two free months if they reactivate their subscriptions.
- The customer clicks the reactivation link and confirms the reactivation on a Cloudify-hosted page.
- 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.
ImportantGet 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
| Parameter | Type | Required | Example | Notes |
|---|---|---|---|---|
| SubscriptionId | str | Yes | S67458907 | The unique identifier of the subscription. |
| Items | array[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
| Parameter | Type | Required | Example | Notes |
|---|---|---|---|---|
| SubscriptionId | str | Yes | S67458907 | The unique identifier of the subscription. |
| NextBillingDate | datetime | Yes | 2026-08-13T12:01:00Z | The 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([" <br/><b>Reactivation Offer</b><br/>Cloudify offers former customers two free months: The customer accepts the offer <br/> "]):::mainColor
--> B([" <br/><b>Subscription Reactivated</b><br/><i>Reinstate Subscription Items</i> endpoint used <br/> "]):::mainColor
--> C([" <br/><b>Billing</b><br/>The <i>Update Next Billing Date</i> endpoint is used to move the next billing date <br/> "]):::mainColor