Skip to main content

Revenue Recognition Schedule API

Create, read, update, and delete revenue recognition schedule records using the NetSuite REST API.


Endpoints

MethodEndpointDescription
GET/record/v1/revRecScheduleList all revenue recognition schedules
GET/record/v1/revRecSchedule/{id}Get specific schedule
POST/record/v1/revRecScheduleCreate 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

FieldTypeDescriptionRequired
idstringInternal ID (read-only)-
namestringSchedule nameYes
isInactivebooleanInactive flagNo

Schedule Configuration

FieldTypeDescriptionRequired
amortizationTypeobjectAmortization methodYes
recurrenceTypeobjectRecurrence frequencyYes
periodOffsetnumberNumber of periodsYes
initialAmountnumberInitial recognition amountNo

Advanced Settings

FieldTypeDescriptionRequired
scheduledDatestringSchedule start dateNo
deferralAccountobjectDeferred revenue accountNo
destinationAccountobjectRecognition destination accountNo

Recognition Settings

FieldTypeDescriptionRequired
recognitionAccountobjectRevenue recognition accountNo
useForeignAmountsbooleanUse foreign currencyNo

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 required
  • amortizationType - Amortization method is required
  • recurrenceType - Recurrence frequency is required
  • periodOffset - Number of periods is required

Amortization Types

Common amortization type values:

  • STRAIGHTLINE - Equal amounts over all periods
  • CUSTOMTEMPLATE - Custom recognition pattern
  • IMMEDIATE - Recognize immediately

Recurrence Types

Common recurrence frequency values:

  • MONTHLY - Monthly recognition
  • QUARTERLY - Quarterly recognition
  • ANNUALLY - Annual recognition
  • DAILY - Daily recognition
  • WEEKLY - 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