Skip to main content
POST
/
v1
/
subscriptions
/
{subscriptionId}
/
extend
Extend a subscription
curl --request POST \
  --url https://api-eu.flexportal.io/v1/subscriptions/{subscriptionId}/extend \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --header 'Tenant-ID: <tenant-id>' \
  --data '
{
  "rentalId": "<string>",
  "extensionMonths": 60,
  "reason": "<string>",
  "newMonthlyAmount": 1,
  "notes": "<string>"
}
'
{
  "success": true,
  "message": "<string>",
  "rentalId": "<string>",
  "assetSerialNumber": "<string>",
  "oldEndDate": "<string>",
  "newEndDate": "<string>",
  "extensionMonths": 60,
  "oldContractLength": 60,
  "newContractLength": 60
}

Overview

Extend an active subscription’s contract period. Extensions allow customers to keep their device longer than the original contract term, typically at a reduced monthly rate.

When to Use Extensions

ScenarioAction
Customer wants same device longerUse Extend
Customer wants a different/newer deviceUse Upgrade
Customer wants to own the deviceUse Buyout

Extension Benefits

  • For customers: Keep familiar device at lower monthly cost
  • For operators: Continue earning revenue on fully depreciated assets
  • For both: No logistics costs (no return/ship new device)

Request Fields

FieldRequiredDescription
extensionMonthsYesNumber of months to extend
newMonthlyAmountNoNew monthly price (default: current price)
reasonNoReason for extension

Basic Example

{
  "extensionMonths": 6
}

Example with Price Adjustment

{
  "extensionMonths": 12,
  "newMonthlyAmount": 79.00,
  "reason": "Loyalty discount for renewal"
}
Extensions are a great opportunity to offer loyalty discounts. Assets are often fully paid off by the end of the initial contract, so lower extension rates can still be highly profitable.

What Happens

When you extend a subscription:
  1. End date pushed forward by extension months
  2. Contract length updated to reflect total duration
  3. Monthly amount updated (if new price provided)
  4. Extension history logged with details
  5. Future payments scheduled at new rate

Pricing Strategy for Extensions

// Example: Calculate extension pricing
function calculateExtensionPrice(subscription, extensionMonths) {
  const currentMonthly = subscription.monthlyAmount;
  const costRecovery = subscription.costRecovery.costRecoveryPercent;

  if (costRecovery >= 100) {
    // Asset is paid off - offer 30% discount
    return currentMonthly * 0.7;
  } else if (costRecovery >= 80) {
    // Almost paid off - offer 20% discount
    return currentMonthly * 0.8;
  } else {
    // Still recovering costs - keep same price
    return currentMonthly;
  }
}

Extension History

After extending, the subscription tracks extension history:
{
  "extensionHistory": [
    {
      "extendedAt": "2025-01-15T10:30:00Z",
      "extensionMonths": 6,
      "previousEndDate": "2025-01-31",
      "newEndDate": "2025-07-31",
      "previousMonthlyAmount": 129.00,
      "newMonthlyAmount": 99.00,
      "reason": "Customer renewal"
    }
  ]
}

Common Extension Periods

PeriodTypical Use
3 monthsShort-term bridge while waiting for upgrade
6 monthsStandard renewal for satisfied customers
12 monthsFull year renewal with loyalty discount
24 monthsLong-term commitment with best pricing

Error Handling

Error CodeCauseSolution
SUBSCRIPTION_NOT_ACTIVESubscription is not activeCan only extend active subscriptions
INVALID_EXTENSION_MONTHSExtension months must be positiveUse positive integer

Authorizations

Authorization
string
header
required

API key obtained from FlexPortal dashboard

Headers

Tenant-ID
string
required

Your tenant identifier

Path Parameters

subscriptionId
string
required

The subscription ID

Body

application/json
rentalId
string
required
Minimum string length: 1
extensionMonths
integer
required
Required range: 1 < x <= 120
reason
string
required
Minimum string length: 1
newMonthlyAmount
number
Required range: x >= 0
notes
string

Response

Extension completed

success
enum<boolean>
required
Available options:
true,
false
message
string
required
rentalId
string
required
assetSerialNumber
string
required
oldEndDate
string
required
newEndDate
string
required
extensionMonths
integer
required
Required range: 0 <= x <= 120
oldContractLength
integer
required
Required range: 1 < x <= 120
newContractLength
integer
required
Required range: 1 < x <= 120