← Files Zuora Coding AgentARCHIVED FILE
references/amendment-rest-v1-suspend-api-mapping.md
27.4 KB · Oct 2, 2026 · 00:30 UTC
# Subscription Suspend API to Order API Migration Guide
Customer-facing guide for converting subscription suspend operations from S/A API to Order API.
## Overview
This guide helps you migrate from the legacy Subscription Suspend API to the modern Order API.
The Subscription Suspend API allows you to:
- Suspend a subscription with or without a specific resume date
- **Suspend and resume a subscription in a single API call** by specifying both suspend and resume parameters
### What You're Migrating
**FROM:** `PUT /v1/subscriptions/{subscription-key}/suspend`
- Can specify suspend parameters only
- Can specify both suspend AND resume parameters in the same call
**TO:** `POST /v1/orders`
- For suspend only: Single `Suspend` action
- For suspend + resume: Both `Suspend` and `Resume` actions in the same order
### Key Architectural Difference: Subscription Versions
**Subscription API** creates multiple subscription versions:
- Suspend + Resume = **2 subscription versions**
- Suspend + Resume + `extendsTerm: true` = **3 subscription versions** (third version is a TermsAndConditions amendment to change term length)
**Order API** consolidates actions into fewer versions:
- Suspend + Resume = **2 order actions**, but only **1 new subscription version**
- Suspend + Resume + `extendsTerm: true` = **3 order actions** (Suspend, Resume, TermsAndConditions), but still only **1 new subscription version**
This means Order API is more efficient in managing subscription version history.
## Quick Comparison
| Aspect | Subscription API | Order API |
|--------|------------------|-----------|
| Endpoint | `PUT /v1/subscriptions/{sub-key}/suspend` | `POST /v1/orders` |
| Action Type | Implicit (suspend) | Explicit (`Suspend`, `Resume`) |
| Multiple Subscriptions | No (one per call) | Yes (one order can affect multiple subs) |
| Suspend + Resume | Creates 2 subscription versions | Creates 2 order actions, 1 subscription version |
| Suspend + Resume + extendsTerm | Creates 3 subscription versions | Creates 3 order actions, 1 subscription version |
| Complexity | Simple | More flexible and efficient |
## Suspend API Field Mapping
### Basic Suspend Request (Suspend Only)
**Subscription API:**
```json
PUT /v1/subscriptions/A-S00000123/suspend
{
"suspendDate": "2026-09-01",
"contractEffectiveDate": "2026-09-01",
"suspendPolicy": "FixedPeriodsFromToday",
"suspendPeriods": 3,
"suspendPeriodsType": "Month"
}
```
**Order API:**
```json
POST /v1/orders
{
"orderDate": "2026-09-01",
"existingAccountNumber": "A00000001",
"subscriptions": [
{
"subscriptionNumber": "A-S00000123",
"orderActions": [
{
"type": "Suspend",
"triggerDates": [
{
"name": "ContractEffective",
"triggerDate": "2026-09-01"
}
],
"suspend": {
"suspendPolicy": "FixedPeriodsFromToday",
"suspendPeriods": "3",
"suspendPeriodsType": "Month"
}
}
]
}
]
}
```
### Suspend with Resume Date (Single Call)
The Suspend API allows you to specify both suspend and resume dates in a single call.
**Subscription API:**
```json
PUT /v1/subscriptions/A-S00000123/suspend
{
"contractEffectiveDate": "2026-04-14",
"suspendPolicy": "SpecificDate",
"suspendSpecificDate": "2026-04-14",
"resumePolicy": "SpecificDate",
"resumeSpecificDate": "2026-04-21",
"extendsTerm": false
}
```
**Order API:**
```json
POST /v1/orders
{
"orderDate": "2026-04-14",
"existingAccountNumber": "A00000001",
"subscriptions": [
{
"subscriptionNumber": "A-S00000123",
"orderActions": [
{
"type": "Suspend",
"triggerDates": [
{
"name": "ContractEffective",
"triggerDate": "2026-04-14"
}
],
"suspend": {
"suspendPolicy": "SpecificDate",
"suspendSpecificDate": "2026-04-14"
}
},
{
"type": "Resume",
"triggerDates": [
{
"name": "ContractEffective",
"triggerDate": "2026-04-21"
}
],
"resume": {
"resumePolicy": "SpecificDate",
"resumeSpecificDate": "2026-04-21",
"extendsTerm": false
}
}
]
}
]
}
```
**Key Differences:**
- In Order API, you specify **two separate actions** (Suspend and Resume) within the same order to achieve suspend + resume in a single call
- The `extendsTerm` field moves from the Subscription API root level to the **Resume action** in Order API
- **Version efficiency**: Subscription API creates 2 subscription versions (suspend + resume), but Order API creates only 1 subscription version with 2 order actions
### Suspend Field Mapping Table
| Subscription Suspend Field | Order API Equivalent | Notes |
|---------------------------|----------------------|-------|
| `contractEffectiveDate` | `triggerDates[].triggerDate` | Primary trigger date for both Suspend and Resume actions |
| `suspendPolicy` | `subscriptions[].orderActions[].suspend.suspendPolicy` | Values: `FixedPeriodsFromToday`, `EndOfLastInvoicePeriod`, `SpecificDate` |
| `suspendSpecificDate` | `subscriptions[].orderActions[].suspend.suspendSpecificDate` | Required when `suspendPolicy` is `SpecificDate` |
| `suspendPeriods` | `subscriptions[].orderActions[].suspend.suspendPeriods` | Number of periods to suspend |
| `suspendPeriodsType` | `subscriptions[].orderActions[].suspend.suspendPeriodsType` | Values: `Day`, `Week`, `Month`, `Year` |
| `resumePolicy` | `subscriptions[].orderActions[].resume.resumePolicy` | Add a separate Resume action. Set to `SpecificDate` when using specific resume date |
| `resumeSpecificDate` | `subscriptions[].orderActions[].resume.resumeSpecificDate` | Required when `resumePolicy` is `SpecificDate` |
| `extendsTerm` | `subscriptions[].orderActions[].resume.extendsTerm` | Extends subscription term by the suspension duration (gap between suspend and resume). Goes in the **Resume action**, not Suspend |
| N/A (implicit in URL) | `subscriptionNumber` | Now in request body |
| N/A (from subscription) | `existingAccountNumber` | Required field |
### New Required Fields
Order API requires these additional fields:
- `orderDate` - The date of the order
- `existingAccountNumber` - The account number
- `subscriptionNumber` - Inside subscriptions array (was in URL path)
## Code Examples
### Python - Suspend Subscription
**Before (Subscription API):**
```python
import requests
subscription_key = "A-S00000123"
url = "https://rest.zuora.com/v1/subscriptions/{subscription_key}/suspend"
payload = {
"suspendDate": "2026-09-01",
"suspendPolicy": "FixedPeriodsFromToday",
"suspendPeriods": 3,
"suspendPeriodsType": "Month"
}
response = requests.put(url, json=payload, headers=headers)
```
**After (Order API):**
```python
import requests
url = "https://rest.zuora.com/v1/orders"
payload = {
"orderDate": "2026-09-01",
"existingAccountNumber": "A00000001", # NEW: Required
"subscriptions": [{
"subscriptionNumber": "A-S00000123",
"orderActions": [{
"type": "Suspend",
"triggerDates": [{
"name": "ContractEffective",
"triggerDate": "2026-09-01"
}],
"suspend": {
"suspendPolicy": "FixedPeriodsFromToday",
"suspendPeriods": "3",
"suspendPeriodsType": "Month"
}
}]
}]
}
response = requests.post(url, json=payload, headers=headers)
```
### Python - Suspend with Resume Date
**Before (Subscription API):**
```python
import requests
subscription_key = "A-S00000123"
url = f"https://rest.zuora.com/v1/subscriptions/{subscription_key}/suspend"
payload = {
"contractEffectiveDate": "2026-04-14",
"suspendPolicy": "SpecificDate",
"suspendSpecificDate": "2026-04-14",
"resumePolicy": "SpecificDate",
"resumeSpecificDate": "2026-04-21", # Resume after 1 week
"extendsTerm": False
}
response = requests.put(url, json=payload, headers=headers)
```
**After (Order API):**
```python
import requests
url = "https://rest.zuora.com/v1/orders"
payload = {
"orderDate": "2026-04-14",
"existingAccountNumber": "A00000001",
"subscriptions": [{
"subscriptionNumber": "A-S00000123",
"orderActions": [
{
"type": "Suspend",
"triggerDates": [{
"name": "ContractEffective",
"triggerDate": "2026-04-14"
}],
"suspend": {
"suspendPolicy": "SpecificDate",
"suspendSpecificDate": "2026-04-14"
}
},
{
"type": "Resume",
"triggerDates": [{
"name": "ContractEffective",
"triggerDate": "2026-04-21"
}],
"resume": {
"resumePolicy": "SpecificDate",
"resumeSpecificDate": "2026-04-21",
"extendsTerm": False
}
}
]
}]
}
response = requests.post(url, json=payload, headers=headers)
```
### Java - Suspend Subscription
**Before (Subscription API):**
```java
String subscriptionKey = "A-S00000123";
String url = "https://rest.zuora.com/v1/subscriptions/" + subscriptionKey + "/suspend";
JSONObject payload = new JSONObject();
payload.put("suspendDate", "2026-09-01");
payload.put("suspendPolicy", "FixedPeriodsFromToday");
payload.put("suspendPeriods", 3);
payload.put("suspendPeriodsType", "Month");
payload.put("extendsTerm", true);
HttpPut request = new HttpPut(url);
request.setEntity(new StringEntity(payload.toString()));
HttpResponse response = httpClient.execute(request);
```
**After (Order API):**
```java
String url = "https://rest.zuora.com/v1/orders";
JSONObject payload = new JSONObject();
payload.put("orderDate", "2026-09-01");
payload.put("existingAccountNumber", "A00000001");
JSONArray subscriptions = new JSONArray();
JSONObject subscription = new JSONObject();
subscription.put("subscriptionNumber", "A-S00000123");
JSONArray orderActions = new JSONArray();
JSONObject action = new JSONObject();
action.put("type", "Suspend");
JSONArray triggerDates = new JSONArray();
JSONObject triggerDate = new JSONObject();
triggerDate.put("name", "ContractEffective");
triggerDate.put("triggerDate", "2026-09-01");
triggerDates.put(triggerDate);
action.put("triggerDates", triggerDates);
JSONObject suspend = new JSONObject();
suspend.put("suspendPolicy", "FixedPeriodsFromToday");
suspend.put("suspendPeriods", "3");
suspend.put("suspendPeriodsType", "Month");
suspend.put("extendsTerm", true);
action.put("suspend", suspend);
orderActions.put(action);
subscription.put("orderActions", orderActions);
subscriptions.put(subscription);
payload.put("subscriptions", subscriptions);
HttpPost request = new HttpPost(url);
request.setEntity(new StringEntity(payload.toString()));
HttpResponse response = httpClient.execute(request);
```
### JavaScript - Suspend Subscription
**Before (Subscription API):**
```javascript
const subscriptionKey = 'A-S00000123';
const url = `https://rest.zuora.com/v1/subscriptions/${subscriptionKey}/suspend`;
const payload = {
suspendDate: '2026-09-01',
suspendPolicy: 'EndOfLastInvoicePeriod'
};
const response = await fetch(url, {
method: 'PUT',
headers: headers,
body: JSON.stringify(payload)
});
```
**After (Order API):**
```javascript
const url = 'https://rest.zuora.com/v1/orders';
const payload = {
orderDate: '2026-09-01',
existingAccountNumber: 'A00000001',
subscriptions: [{
subscriptionNumber: 'A-S00000123',
orderActions: [{
type: 'Suspend',
triggerDates: [{
name: 'ContractEffective',
triggerDate: '2026-09-01'
}],
suspend: {
suspendPolicy: 'EndOfLastInvoicePeriod'
}
}]
}]
};
const response = await fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(payload)
});
```
### JavaScript - Suspend with Resume Date
**Before (Subscription API):**
```javascript
const subscriptionKey = 'A-S00000123';
const url = `https://rest.zuora.com/v1/subscriptions/${subscriptionKey}/suspend`;
const payload = {
contractEffectiveDate: '2026-04-14',
suspendPolicy: 'SpecificDate',
suspendSpecificDate: '2026-04-14',
resumePolicy: 'SpecificDate',
resumeSpecificDate: '2026-04-21', // Resume after 1 week
extendsTerm: false
};
const response = await fetch(url, {
method: 'PUT',
headers: headers,
body: JSON.stringify(payload)
});
```
**After (Order API):**
```javascript
const url = 'https://rest.zuora.com/v1/orders';
const payload = {
orderDate: '2026-04-14',
existingAccountNumber: 'A00000001',
subscriptions: [{
subscriptionNumber: 'A-S00000123',
orderActions: [
{
type: 'Suspend',
triggerDates: [{
name: 'ContractEffective',
triggerDate: '2026-04-14'
}],
suspend: {
suspendPolicy: 'SpecificDate',
suspendSpecificDate: '2026-04-14'
}
},
{
type: 'Resume',
triggerDates: [{
name: 'ContractEffective',
triggerDate: '2026-04-21'
}],
resume: {
resumePolicy: 'SpecificDate',
resumeSpecificDate: '2026-04-21',
extendsTerm: false
}
}
]
}]
};
const response = await fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(payload)
});
```
## Suspend Policies
The `suspendPolicy` field determines how the system calculates suspend and resume dates. Choose the appropriate policy based on your use case:
- **`SpecificDate`** - Use when you specify exact suspend/resume dates
- **`FixedPeriodsFromToday`** - Use when you want to suspend for a calculated period (e.g., "3 months from today")
- **`EndOfLastInvoicePeriod`** - Use when you want to align suspension with billing periods
### FixedPeriodsFromToday
Suspend for a fixed number of periods from the suspend date.
**Subscription API:**
```json
{
"suspendPolicy": "FixedPeriodsFromToday",
"suspendPeriods": 3,
"suspendPeriodsType": "Month"
}
```
**Order API:**
```json
{
"suspend": {
"suspendPolicy": "FixedPeriodsFromToday",
"suspendPeriods": "3",
"suspendPeriodsType": "Month"
}
}
```
**Note:** `suspendPeriods` and `suspendPeriodsType` are required when using `FixedPeriodsFromToday`.
### EndOfLastInvoicePeriod
Suspend at the end of the last invoice period.
**Subscription API:**
```json
{
"suspendPolicy": "EndOfLastInvoicePeriod"
}
```
**Order API:**
```json
{
"suspend": {
"suspendPolicy": "EndOfLastInvoicePeriod"
}
}
```
### SpecificDate
Suspend on a specific date. Use this policy when you specify exact suspend/resume dates.
**Subscription API:**
```json
{
"suspendPolicy": "SpecificDate",
"suspendSpecificDate": "2026-09-01"
}
```
**Order API:**
```json
{
"suspend": {
"suspendPolicy": "SpecificDate",
"suspendSpecificDate": "2026-09-01"
},
"triggerDates": [{
"name": "ContractEffective",
"triggerDate": "2026-09-01"
}]
}
```
**Note:** When using `SpecificDate`, you must specify both `suspendSpecificDate` in the suspend object AND the date in `triggerDates`. If you also specify a resume date, set `resumePolicy: "SpecificDate"` and `resumeSpecificDate` in the Resume action.
## Key Differences Summary
| Aspect | Subscription API | Order API |
|--------|------------------|-----------|
| **API Structure** | | |
| Suspend only | Single call with `suspendPolicy` | Single Suspend action |
| Suspend with resume | Single call with `suspendSpecificDate`, `resumeSpecificDate`, `suspendPolicy: "SpecificDate"`, `resumePolicy: "SpecificDate"` | Two actions: Suspend + Resume, both with policy and specific dates |
| Suspend for period | `suspendPolicy: "FixedPeriodsFromToday"` with periods | Same policy in Suspend action |
| Term extension | `extendsTerm: true` at root level | `extendsTerm: true` in **resume** object (not suspend) |
| **Subscription Versions** | | |
| Suspend + Resume | Creates **2 new versions** | Creates **1 new version** with 2 order actions |
| Suspend + Resume + extendsTerm | Creates **3 new versions** (suspend, resume, terms amendment) | Creates **1 new version** with 3 order actions |
## Response Handling
### Subscription API Response
```json
{
"success": true,
"subscriptionId": "2c92a0fd...",
"suspendDate": "2026-09-01",
"resumeDate": "2026-12-01",
"totalDeltaMrr": 0.00
}
```
### Order API Response
```json
{
"success": true,
"orderNumber": "O-00001234",
"accountNumber": "A00000001",
"status": "Pending",
"subscriptions": [
{
"subscriptionNumber": "A-S00000123",
"status": "Suspended",
"suspendDate": "2026-09-01",
"resumeDate": "2026-12-01"
}
]
}
```
**Key Differences:**
- Order API returns `orderNumber` instead of just `subscriptionId`
- Order API includes full subscription details with status
- Order API response structure is consistent across all operations
## Migration Checklist
- [ ] Identify all subscription suspend API calls in your code
- [ ] Check if any calls include `resumeSpecificDate`/`resumePolicy` (requires two order actions: Suspend + Resume)
- [ ] Update endpoint from `PUT /v1/subscriptions/{key}/suspend` to `POST /v1/orders`
- [ ] Add required `orderDate` field
- [ ] Add required `existingAccountNumber` field
- [ ] Change `type` to `"Suspend"`
- [ ] If `resumeSpecificDate` exists, add a second order action with `type` = `"Resume"` including `resumePolicy` and `resumeSpecificDate`
- [ ] Wrap suspend parameters in `suspend` object
- [ ] When using `SpecificDate` policy, include both `suspendSpecificDate`/`resumeSpecificDate` in the action object AND dates in `triggerDates` array
- [ ] Nest actions in `orderActions` array
- [ ] Update response handling for new structure
- [ ] Test in sandbox environment
## Common Migration Patterns
### Pattern 1: Simple Suspend at End of Invoice Period
**Before:**
```json
PUT /v1/subscriptions/A-S00000123/suspend
{
"suspendPolicy": "EndOfLastInvoicePeriod"
}
```
**After:**
```json
POST /v1/orders
{
"orderDate": "2026-04-07",
"existingAccountNumber": "A00000001",
"subscriptions": [{
"subscriptionNumber": "A-S00000123",
"orderActions": [{
"type": "Suspend",
"suspend": {
"suspendPolicy": "EndOfLastInvoicePeriod"
}
}]
}]
}
```
### Pattern 2: Suspend for Fixed Period
**Before:**
```json
PUT /v1/subscriptions/A-S00000123/suspend
{
"suspendPolicy": "FixedPeriodsFromToday",
"suspendPeriods": 6,
"suspendPeriodsType": "Month"
}
```
**After:**
```json
POST /v1/orders
{
"orderDate": "2026-04-07",
"existingAccountNumber": "A00000001",
"subscriptions": [{
"subscriptionNumber": "A-S00000123",
"orderActions": [{
"type": "Suspend",
"suspend": {
"suspendPolicy": "FixedPeriodsFromToday",
"suspendPeriods": "6",
"suspendPeriodsType": "Month"
}
}]
}]
}
```
### Pattern 3: Suspend Multiple Subscriptions
**Before (required multiple API calls):**
```json
PUT /v1/subscriptions/A-S00000123/suspend
PUT /v1/subscriptions/A-S00000124/suspend
```
**After (single API call):**
```json
POST /v1/orders
{
"orderDate": "2026-04-07",
"existingAccountNumber": "A00000001",
"subscriptions": [
{
"subscriptionNumber": "A-S00000123",
"orderActions": [{
"type": "Suspend",
"suspend": {"suspendPolicy": "EndOfLastInvoicePeriod"}
}]
},
{
"subscriptionNumber": "A-S00000124",
"orderActions": [{
"type": "Suspend",
"suspend": {"suspendPolicy": "EndOfLastInvoicePeriod"}
}]
}
]
}
```
### Pattern 4: Suspend with Known Resume Date
When both suspend and resume dates are known (common use case).
**Before:**
```json
PUT /v1/subscriptions/A-S00000123/suspend
{
"contractEffectiveDate": "2026-04-14",
"suspendPolicy": "SpecificDate",
"suspendSpecificDate": "2026-04-14",
"resumePolicy": "SpecificDate",
"resumeSpecificDate": "2026-04-21",
"extendsTerm": false
}
```
**After:**
```json
POST /v1/orders
{
"orderDate": "2026-04-14",
"existingAccountNumber": "A00000001",
"subscriptions": [{
"subscriptionNumber": "A-S00000123",
"orderActions": [
{
"type": "Suspend",
"triggerDates": [{
"name": "ContractEffective",
"triggerDate": "2026-04-14"
}],
"suspend": {
"suspendPolicy": "SpecificDate",
"suspendSpecificDate": "2026-04-14"
}
},
{
"type": "Resume",
"triggerDates": [{
"name": "ContractEffective",
"triggerDate": "2026-04-21"
}],
"resume": {
"resumePolicy": "SpecificDate",
"resumeSpecificDate": "2026-04-21",
"extendsTerm": false
}
}
]
}]
}
```
**Note:** This is one of the most common patterns - suspending for a known period (e.g., vacation, temporary service pause).
Key observations:
- The suspension duration is 7 days
- If `extendsTerm: true` (in the Resume action), the subscription term would be extended by 7 days, which creates an additional TermsAndConditions order action
- **Subscription API** would create **2 versions** for this operation; **Order API** creates only **1 version** with 2 order actions
## Benefits of Order API
1. **Fewer Subscription Versions**: Order API creates fewer subscription versions compared to Subscription API, simplifying version history
- Suspend + Resume: 1 version vs. 2 versions in Subscription API
- Suspend + Resume + extendsTerm: 1 version vs. 3 versions in Subscription API
2. **Bulk Operations**: Suspend multiple subscriptions in one call
3. **Combined Actions**: Schedule suspend with other order actions in the same order
4. **Better Tracking**: Order number for complete audit trail across all actions
5. **Consistency**: Same endpoint for all subscription modifications
6. **Future-Proof**: Order API is the strategic direction
## Important Notes
### extendsTerm Behavior
The `extendsTerm` field controls whether the subscription term should be extended by the **duration of the suspension period** (the gap between suspend and resume dates).
- `extendsTerm: true` - Extends the subscription term by the number of days the subscription was suspended
- `extendsTerm: false` - Keeps the original term end date unchanged
**Example:**
- Original term end date: Dec 31, 2026
- Suspend date: Apr 14, 2026
- Resume date: Apr 21, 2026
- Suspension duration: 7 days
- With `extendsTerm: true` → New term end: Jan 7, 2027 (extended by 7 days)
- With `extendsTerm: false` → Term end remains Dec 31, 2026
**Important for Order API Migration:**
- In **Subscription API**: `extendsTerm` is at the root level of the suspend request
- In **Order API**: `extendsTerm` goes in the **Resume action** (`resume` object), NOT in the Suspend action
- If you have a suspend-only operation (no resume date), `extendsTerm` will be applied when the subscription is resumed later
**How extendsTerm Works:**
When `extendsTerm: true` is set:
- **Subscription API**: Creates a separate **TermsAndConditions amendment** as a third subscription version to change the term length
- **Order API**: Creates a **TermsAndConditions order action** along with Suspend and Resume actions, all consolidated into one subscription version
Example with `extendsTerm: true`:
- Subscription API: 3 separate versions (Suspend → Resume → TermsAndConditions)
- Order API: 3 order actions, but 1 version (Suspend + Resume + TermsAndConditions)
### Suspend Period Calculation
When using `FixedPeriodsFromToday`:
- Suspend date + (suspendPeriods × suspendPeriodsType) = Resume date
- Example: Suspend on Apr 1 + 3 Months = Resume on Jul 1
### Specifying Resume Date
You have two options for controlling when a subscription resumes:
**Option 1: Use `resumeSpecificDate` field with `resumePolicy: "SpecificDate"` (Subscription API)**
- Specify exact resume date in the suspend call
- Requires setting `resumePolicy: "SpecificDate"`
- Maps to separate Resume action in Order API with `resumePolicy` and `resumeSpecificDate`
- Best for known resume dates (e.g., vacation period, seasonal pause)
**Option 2: Use `suspendPolicy` with periods**
- System calculates resume date automatically
- Use `FixedPeriodsFromToday` with `suspendPeriods` and `suspendPeriodsType`
- Best for relative time periods (e.g., "suspend for 3 months")
### Billing During Suspension
- Suspended subscriptions typically don't generate charges
- Depends on your rate plan configuration
- Test in sandbox to verify billing behavior
## Order Actions vs Subscription Versions
Understanding how actions and versions are created is crucial for migration planning.
### Subscription API Behavior
The Subscription Suspend API creates a **new subscription version for each state change**:
**Scenario 1: Suspend + Resume (without extendsTerm)**
1. Call suspend with resume
2. Creates **Version 2**: Suspended state
3. Creates **Version 3**: Active state (resume)
4. **Total: 2 new versions**
**Scenario 2: Suspend + Resume + extendsTerm=true**
1. Call suspend with resume and `extendsTerm: true`
2. Creates **Version 2**: Suspended state
3. Creates **Version 3**: Active state (resume)
4. Creates **Version 4**: TermsAndConditions amendment to extend term length
5. **Total: 3 new versions**
### Order API Behavior
The Order API creates **multiple order actions but consolidates into fewer subscription versions**:
**Scenario 1: Suspend + Resume (without extendsTerm)**
1. Single order with 2 actions: Suspend + Resume
2. Creates **2 order actions**: `SuspendSubscription` and `ResumeSubscription`
3. Creates **1 new subscription version** containing both changes
4. **Total: 1 new version** (vs. 2 in Subscription API)
**Scenario 2: Suspend + Resume + extendsTerm=true**
1. Single order with 3 actions: Suspend + Resume (with extendsTerm)
2. Creates **3 order actions**: `SuspendSubscription`, `ResumeSubscription`, and `TermsAndConditions`
3. Creates **1 new subscription version** containing all changes
4. **Total: 1 new version** (vs. 3 in Subscription API)
### Why This Matters
**Version History Clarity:**
- Fewer versions mean cleaner subscription history
- Easier to track and audit changes
- Reduced database overhead
**Rollback Considerations:**
- Subscription API: Each version can be individually identified
- Order API: Multiple actions are bundled into one version
**Reporting and Analytics:**
- Version counts will differ between the two APIs
- Ensure reporting tools account for this difference
## Error Handling
### Common Errors
**Error: Missing existingAccountNumber**
```json
{
"success": false,
"reasons": [{
"code": 53100320,
"message": "existingAccountNumber is required"
}]
}
```
**Solution:** Add the account number to your order request.
**Error: Invalid suspend policy**
```json
{
"success": false,
"reasons": [{
"code": 53100040,
"message": "Invalid suspendPolicy value"
}]
}
```
**Solution:** Use valid policy: `FixedPeriodsFromToday`, `EndOfLastInvoicePeriod`, or `SpecificDate`.
**Error: Missing suspend periods**
```json
{
"success": false,
"reasons": [{
"code": 53100040,
"message": "suspendPeriods and suspendPeriodsType are required for FixedPeriodsFromToday policy"
}]
}
```
**Solution:** When using `FixedPeriodsFromToday`, include both `suspendPeriods` and `suspendPeriodsType`.
## Resources
- [Order API Documentation](https://www.zuora.com/developer/api-references/api/tag/Orders)
- [Subscription API Documentation](https://www.zuora.com/developer/api-references/api/tag/Subscriptions)
- [Suspend Operation Guide](https://knowledgecenter.zuora.com/)
SHA-256: 6ff06159d62da2f37430ebd88b26565264db5b7b0fecc7541624548c37280591