Skip to main content

Customer Subsidiary Relationship API

In OneWorld accounts, manage which subsidiaries a customer can transact with.


Endpoints​

MethodEndpointDescription
GET/record/v1/customerSubsidiaryRelationshipList relationships
GET/record/v1/customerSubsidiaryRelationship/{id}Get specific relationship
POST/record/v1/customerSubsidiaryRelationshipCreate relationship
PATCH/record/v1/customerSubsidiaryRelationship/{id}Update relationship
DELETE/record/v1/customerSubsidiaryRelationship/{id}Delete relationship

Base URL​

https://{account_id}.suitetalk.api.netsuite.com/services/rest/record/v1/customerSubsidiaryRelationship

Key Fields​

Core Fields​

FieldTypeDescriptionRequired
idstringInternal ID (read-only)-
entityobjectCustomer referenceYes
subsidiaryobjectSubsidiary referenceYes
isPrimarySubsidiarybooleanPrimary subsidiary flagNo

Financial Fields (Read-Only)​

FieldTypeDescription
balancenumberA/R balance in this subsidiary
depositBalancenumberDeposit balance
unbilledOrdersnumberUnbilled order total
overdueBalancenumberOverdue balance amount
consolBalancenumberConsolidated balance
consolDepositBalancenumberConsolidated deposit balance
consolUnbilledOrdersnumberConsolidated unbilled orders
consolOverdueBalancenumberConsolidated overdue balance

Tax & Pricing Fields​

FieldTypeDescription
taxRegistrationobjectTax registration for subsidiary
priceLevelobjectPrice level for this subsidiary
currencyobjectTransaction currency

Classification Fields​

FieldTypeDescription
classobjectClass for this subsidiary
departmentobjectDepartment for this subsidiary
locationobjectLocation for this subsidiary

Example: Create Subsidiary Relationship​

POST /record/v1/customerSubsidiaryRelationship
Content-Type: application/json
Authorization: Bearer {access_token}
{
"entity": {
"id": "456"
},
"subsidiary": {
"id": "2"
},
"isPrimarySubsidiary": false,
"priceLevel": {
"id": "3"
},
"currency": {
"id": "2"
}
}

Response​

{
"links": [
{
"rel": "self",
"href": "https://1234567.suitetalk.api.netsuite.com/services/rest/record/v1/customerSubsidiaryRelationship/789"
}
],
"id": "789",
"entity": {
"id": "456",
"refName": "Acme Corporation"
},
"subsidiary": {
"id": "2",
"refName": "Acme UK Ltd"
},
"isPrimarySubsidiary": false,
"balance": 0,
"depositBalance": 0,
"unbilledOrders": 0,
"currency": {
"id": "2",
"refName": "GBP"
}
}

Example: Update Subsidiary Relationship​

PATCH /record/v1/customerSubsidiaryRelationship/789
Content-Type: application/json
Authorization: Bearer {access_token}
{
"priceLevel": {
"id": "5"
},
"class": {
"id": "10"
}
}

Response​

{
"links": [
{
"rel": "self",
"href": "https://1234567.suitetalk.api.netsuite.com/services/rest/record/v1/customerSubsidiaryRelationship/789"
}
],
"id": "789",
"entity": {
"id": "456",
"refName": "Acme Corporation"
},
"subsidiary": {
"id": "2",
"refName": "Acme UK Ltd"
},
"priceLevel": {
"id": "5",
"refName": "Wholesale - UK"
},
"class": {
"id": "10",
"refName": "International"
}
}

Query Filters​

Find All Relationships for a Customer​

GET /record/v1/customerSubsidiaryRelationship?q=entity='456'

Find All Customers for a Subsidiary​

GET /record/v1/customerSubsidiaryRelationship?q=subsidiary='2'

Find Primary Subsidiary Relationship​

GET /record/v1/customerSubsidiaryRelationship?q=entity='456' AND isPrimarySubsidiary=true

Find Relationships with Balance​

GET /record/v1/customerSubsidiaryRelationship?q=balance > 0

Find Relationships with Overdue Balance​

GET /record/v1/customerSubsidiaryRelationship?q=overdueBalance > 0

Common Use Cases​

1. Multi-Subsidiary Customer Setup​

Allow a customer to transact in multiple subsidiaries while maintaining separate balances:

// Customer's primary subsidiary (set on customer record)
await createCustomer({
companyName: "Global Corp",
subsidiary: { id: "1" } // US subsidiary (primary)
});

// Add UK subsidiary relationship
await createCustomerSubsidiaryRelationship({
entity: { id: "456" },
subsidiary: { id: "2" }, // UK subsidiary
currency: { id: "2" }, // GBP
priceLevel: { id: "3" } // UK pricing
});

// Add Germany subsidiary relationship
await createCustomerSubsidiaryRelationship({
entity: { id: "456" },
subsidiary: { id: "3" }, // Germany subsidiary
currency: { id: "3" }, // EUR
priceLevel: { id: "4" } // EU pricing
});

2. Check Customer Balance by Subsidiary​

const relationships = await getCustomerSubsidiaryRelationships("entity='456'");

relationships.forEach(rel => {
console.log(`${rel.subsidiary.refName}: ${rel.balance}`);
});

// Output:
// Acme US Inc: $50,000
// Acme UK Ltd: £25,000
// Acme DE GmbH: €30,000

3. Set Subsidiary-Specific Pricing​

// Different price levels for different subsidiaries
await patchCustomerSubsidiaryRelationship(usRelId, {
priceLevel: { id: "1" } // US Retail
});

await patchCustomerSubsidiaryRelationship(ukRelId, {
priceLevel: { id: "2" } // UK Wholesale
});

4. Subsidiary-Specific Classifications​

// Assign different departments/classes per subsidiary
await patchCustomerSubsidiaryRelationship(relId, {
department: { id: "5" }, // International Sales
class: { id: "10" }, // Enterprise
location: { id: "3" } // London Office
});

5. Tax Registration per Subsidiary​

// Set VAT registration for EU subsidiary
await patchCustomerSubsidiaryRelationship(euRelId, {
taxRegistration: { id: "15" } // EU VAT Registration
});

Important Notes​

OneWorld Only​

This record type only exists in NetSuite OneWorld accounts with multiple subsidiaries. If you're not using OneWorld, this endpoint will not be available.

Primary Subsidiary​

  • Each customer must have exactly one primary subsidiary
  • The primary subsidiary is set on the main customer record via the subsidiary field
  • Setting isPrimarySubsidiary=true on a relationship does NOT make it primary
  • To change the primary subsidiary, update the customer record directly

Required Fields​

  • entity: Customer reference is required
  • subsidiary: Subsidiary reference is required
  • The combination of entity + subsidiary must be unique

Read-Only Financial Fields​

All balance fields are calculated by NetSuite and cannot be set via API:

  • balance, depositBalance, unbilledOrders, overdueBalance
  • consolBalance, consolDepositBalance, consolUnbilledOrders, consolOverdueBalance

These fields are automatically updated when transactions are posted.

Consolidated Balances​

Fields prefixed with consol show balances in the parent subsidiary's currency after consolidation. Useful for reporting across subsidiaries.

Currency Handling​

  • Each subsidiary relationship can have its own currency
  • The currency should typically match the subsidiary's base currency
  • If not specified, defaults to the subsidiary's currency

Permissions​

  • Users can only create/view relationships for subsidiaries they have access to
  • Subsidiary restrictions apply based on user role permissions

Deleting Relationships​

  • Cannot delete the primary subsidiary relationship
  • Cannot delete if there are unpaid transactions in the subsidiary
  • Consider setting isInactive=true on the customer record for the subsidiary instead

Best Practices​

  • Create subsidiary relationships during customer onboarding
  • Set appropriate price levels per subsidiary/region
  • Use tax registrations for VAT/GST compliance
  • Monitor balances across subsidiaries for credit management
  • Apply consistent classification schemes across subsidiaries

Multi-Currency Considerations​

Currency per Subsidiary​

// US customer with international operations
const usRel = await createCustomerSubsidiaryRelationship({
entity: { id: "456" },
subsidiary: { id: "1" }, // US
currency: { id: "1" } // USD
});

const ukRel = await createCustomerSubsidiaryRelationship({
entity: { id: "456" },
subsidiary: { id: "2" }, // UK
currency: { id: "2" } // GBP
});

Consolidated Reporting​

Use consolBalance fields to see all balances in a common currency:

const relationships = await getCustomerSubsidiaryRelationships("entity='456'");

const totalConsolidated = relationships.reduce((sum, rel) => {
return sum + rel.consolBalance; // All in parent subsidiary currency
}, 0);

See Also​