Revenue Recognition Schedule API
Create, read, update, and delete revenue recognition schedule records using the NetSuite REST API.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET | /record/v1/revRecSchedule | List all revenue recognition schedules |
GET | /record/v1/revRecSchedule/{id} | Get specific schedule |
POST | /record/v1/revRecSchedule | Create new schedule |
PATCH | /record/v1/revRecSchedule/{id} | Update existing schedule |
DELETE | /record/v1/revRecSchedule/{id} | Delete schedule |
Base URL
https://{account_id}.suitetalk.api.netsuite.com/services/rest/record/v1/revRecSchedule
Key Fields
Basic Information
| Field | Type | Description | Required |
|---|---|---|---|
id | string | Internal ID (read-only) | - |
name | string | Schedule name | Yes |
isInactive | boolean | Inactive flag | No |
Schedule Configuration
| Field | Type | Description | Required |
|---|---|---|---|
amortizationType | object | Amortization method | Yes |
recurrenceType | object | Recurrence frequency | Yes |
periodOffset | number | Number of periods | Yes |
initialAmount | number | Initial recognition amount | No |
Advanced Settings
| Field | Type | Description | Required |
|---|---|---|---|
scheduledDate | string | Schedule start date | No |
deferralAccount | object | Deferred revenue account | No |
destinationAccount | object | Recognition destination account | No |
Recognition Settings
| Field | Type | Description | Required |
|---|---|---|---|
recognitionAccount | object | Revenue recognition account | No |
useForeignAmounts | boolean | Use foreign currency | No |
Example: Create Revenue Recognition Schedule
POST /record/v1/revRecSchedule
Content-Type: application/json
Authorization: Bearer {access_token}
{
"name": "Annual Software License",
"amortizationType": {
"id": "STRAIGHTLINE"
},
"recurrenceType": {
"id": "MONTHLY"
},
"periodOffset": 12,
"isInactive": false
}
Response
{
"links": [
{
"rel": "self",
"href": "https://1234567.suitetalk.api.netsuite.com/services/rest/record/v1/revRecSchedule/25"
}
],
"id": "25",
"name": "Annual Software License",
"amortizationType": {
"id": "STRAIGHTLINE",
"refName": "Straight Line"
},
"recurrenceType": {
"id": "MONTHLY",
"refName": "Monthly"
},
"periodOffset": 12,
"isInactive": false
}
Example: Create Quarterly Recognition Schedule
POST /record/v1/revRecSchedule
Content-Type: application/json
{
"name": "Quarterly Service Contract",
"amortizationType": {
"id": "STRAIGHTLINE"
},
"recurrenceType": {
"id": "QUARTERLY"
},
"periodOffset": 4,
"isInactive": false
}
Example: Create Custom Recognition Schedule
POST /record/v1/revRecSchedule
Content-Type: application/json
{
"name": "18-Month Product Warranty",
"amortizationType": {
"id": "STRAIGHTLINE"
},
"recurrenceType": {
"id": "MONTHLY"
},
"periodOffset": 18,
"deferralAccount": {
"id": "150"
},
"destinationAccount": {
"id": "400"
},
"isInactive": false
}
Example: Update Recognition Schedule
PATCH /record/v1/revRecSchedule/25
Content-Type: application/json
{
"periodOffset": 24,
"name": "Bi-Annual Software License"
}
Partial Updates
With PATCH, only include fields you want to change. All other fields remain unchanged.
Query Filters
Find Schedules by Name
GET /record/v1/revRecSchedule?q=name LIKE 'Annual%'
Find Active Schedules
GET /record/v1/revRecSchedule?q=isInactive=false
Find Monthly Schedules
GET /record/v1/revRecSchedule?q=recurrenceType='MONTHLY'
Find Schedules by Period Length
GET /record/v1/revRecSchedule?q=periodOffset=12
Find Straight-Line Schedules
GET /record/v1/revRecSchedule?q=amortizationType='STRAIGHTLINE'
Common Use Cases
1. Create Standard Subscription Schedules
const schedules = [
{
name: "Monthly Subscription",
amortizationType: { id: "STRAIGHTLINE" },
recurrenceType: { id: "MONTHLY" },
periodOffset: 1
},
{
name: "Annual Subscription",
amortizationType: { id: "STRAIGHTLINE" },
recurrenceType: { id: "MONTHLY" },
periodOffset: 12
},
{
name: "3-Year License",
amortizationType: { id: "STRAIGHTLINE" },
recurrenceType: { id: "MONTHLY" },
periodOffset: 36
}
];
for (const schedule of schedules) {
await createRevRecSchedule(schedule);
}
2. Create Service Contract Schedule
await createRevRecSchedule({
name: "24-Month Service Contract",
amortizationType: { id: "STRAIGHTLINE" },
recurrenceType: { id: "MONTHLY" },
periodOffset: 24,
deferralAccount: { id: "150" },
destinationAccount: { id: "400" }
});
3. Update Schedule Period
await patchRevRecSchedule(scheduleId, {
periodOffset: 18,
name: "Updated 18-Month Schedule"
});
4. Deactivate Obsolete Schedule
await patchRevRecSchedule(oldScheduleId, {
isInactive: true
});
Important Notes
Required Fields
name- Schedule name is requiredamortizationType- Amortization method is requiredrecurrenceType- Recurrence frequency is requiredperiodOffset- Number of periods is required
Amortization Types
Common amortization type values:
STRAIGHTLINE- Equal amounts over all periodsCUSTOMTEMPLATE- Custom recognition patternIMMEDIATE- Recognize immediately
Recurrence Types
Common recurrence frequency values:
MONTHLY- Monthly recognitionQUARTERLY- Quarterly recognitionANNUALLY- Annual recognitionDAILY- Daily recognitionWEEKLY- Weekly recognition
Period Offset Calculation
- Represents the number of periods over which revenue is recognized
- For monthly recurrence with 12 period offset = 12 months (1 year)
- For quarterly recurrence with 4 period offset = 4 quarters (1 year)
Account Configuration
- Deferral Account: Where unearned revenue is initially recorded
- Destination Account: Where revenue is recognized over time
- If not specified, uses default accounts from transaction or item setup
Schedule Activation
- Inactive schedules cannot be assigned to new items or transactions
- Existing items/transactions continue using their original schedule
- Consider creating new schedules rather than modifying active ones
Best Practices
- Use descriptive naming that includes the period length (e.g., "12-Month Subscription")
- Create templates for common recognition patterns
- Test schedules with sample transactions before production use
- Document the business purpose of each schedule
- Review and update schedules when accounting policies change
Integration with Revenue Recognition
- Items: Assign schedules to subscription or service items
- Transactions: Revenue recognition is automatically calculated from schedules
- Journal Entries: System generates recognition journal entries based on schedule
- Revenue Recognition Templates: Use templates for more complex patterns
ASC 606 / IFRS 15 Compliance
- Revenue recognition schedules help comply with revenue recognition standards
- Ensure schedules match contract terms and performance obligations
- Consider multi-element arrangements and allocation requirements
- Document the rationale for recognition patterns
Common Recognition Patterns
- Software Licenses: 12-36 months, monthly recognition
- Service Contracts: Contract length, monthly/quarterly recognition
- Warranties: Warranty period, monthly recognition
- Subscriptions: Subscription term, monthly recognition
- Maintenance: Maintenance period, monthly/quarterly recognition
See Also
- Revenue Recognition Template - Complex recognition patterns
- Inventory Item - Assign schedules to items
- Invoice - Invoices with revenue recognition
- Journal Entry - Recognition journal entries