Skip to main content

Vendor Subsidiary Relationship API

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


Endpoints​

MethodEndpointDescription
GET/record/v1/vendorSubsidiaryRelationshipList relationships
GET/record/v1/vendorSubsidiaryRelationship/{id}Get specific relationship
POST/record/v1/vendorSubsidiaryRelationshipCreate relationship
PATCH/record/v1/vendorSubsidiaryRelationship/{id}Update relationship
DELETE/record/v1/vendorSubsidiaryRelationship/{id}Delete relationship

Base URL​

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

Key Fields​

Core Fields​

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

Financial Fields (Read-Only)​

FieldTypeDescription
balancenumberA/P balance in this subsidiary
unbilledOrdersnumberUnbilled purchase order total
consolBalancenumberConsolidated balance
consolUnbilledOrdersnumberConsolidated unbilled orders

Tax & Payment Fields​

FieldTypeDescription
taxRegistrationobjectTax registration for subsidiary
payablesAccountobjectA/P account for this subsidiary
currencyobjectTransaction currency
termsobjectPayment terms for this subsidiary

Classification Fields​

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

Example: Create Subsidiary Relationship​

POST /record/v1/vendorSubsidiaryRelationship
Content-Type: application/json
Authorization: Bearer {access_token}
{
"entity": {
"id": "789"
},
"subsidiary": {
"id": "2"
},
"isPrimarySubsidiary": false,
"currency": {
"id": "2"
},
"terms": {
"id": "3"
},
"payablesAccount": {
"id": "25"
}
}

Response​

{
"links": [
{
"rel": "self",
"href": "https://1234567.suitetalk.api.netsuite.com/services/rest/record/v1/vendorSubsidiaryRelationship/1234"
}
],
"id": "1234",
"entity": {
"id": "789",
"refName": "Global Supplies Inc"
},
"subsidiary": {
"id": "2",
"refName": "Acme Canada Ltd"
},
"isPrimarySubsidiary": false,
"balance": 0,
"unbilledOrders": 0,
"currency": {
"id": "2",
"refName": "CAD"
},
"terms": {
"id": "3",
"refName": "Net 45"
}
}

Example: Update Subsidiary Relationship​

PATCH /record/v1/vendorSubsidiaryRelationship/1234
Content-Type: application/json
Authorization: Bearer {access_token}
{
"terms": {
"id": "2"
},
"class": {
"id": "8"
},
"location": {
"id": "5"
}
}

Response​

{
"links": [
{
"rel": "self",
"href": "https://1234567.suitetalk.api.netsuite.com/services/rest/record/v1/vendorSubsidiaryRelationship/1234"
}
],
"id": "1234",
"entity": {
"id": "789",
"refName": "Global Supplies Inc"
},
"subsidiary": {
"id": "2",
"refName": "Acme Canada Ltd"
},
"terms": {
"id": "2",
"refName": "Net 30"
},
"class": {
"id": "8",
"refName": "Procurement"
},
"location": {
"id": "5",
"refName": "Toronto Office"
}
}

Query Filters​

Find All Relationships for a Vendor​

GET /record/v1/vendorSubsidiaryRelationship?q=entity='789'

Find All Vendors for a Subsidiary​

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

Find Primary Subsidiary Relationship​

GET /record/v1/vendorSubsidiaryRelationship?q=entity='789' AND isPrimarySubsidiary=true

Find Relationships with Balance​

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

Find Relationships with Unbilled Orders​

GET /record/v1/vendorSubsidiaryRelationship?q=unbilledOrders > 0

Common Use Cases​

1. Multi-Subsidiary Vendor Setup​

Allow a vendor to supply multiple subsidiaries while maintaining separate balances:

// Vendor's primary subsidiary (set on vendor record)
await createVendor({
companyName: "Global Supplies Inc",
subsidiary: { id: "1" } // US subsidiary (primary)
});

// Add Canada subsidiary relationship
await createVendorSubsidiaryRelationship({
entity: { id: "789" },
subsidiary: { id: "2" }, // Canada subsidiary
currency: { id: "2" }, // CAD
terms: { id: "3" } // Net 45
});

// Add UK subsidiary relationship
await createVendorSubsidiaryRelationship({
entity: { id: "789" },
subsidiary: { id: "3" }, // UK subsidiary
currency: { id: "3" }, // GBP
terms: { id: "2" } // Net 30
});

2. Check Vendor Balance by Subsidiary​

const relationships = await getVendorSubsidiaryRelationships("entity='789'");

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

// Output:
// Acme US Inc: $75,000
// Unbilled POs: $25,000
// Acme Canada Ltd: $45,000 CAD
// Unbilled POs: $10,000 CAD
// Acme UK Ltd: £30,000
// Unbilled POs: £5,000

3. Set Subsidiary-Specific Payment Terms​

// Different payment terms for different subsidiaries
await patchVendorSubsidiaryRelationship(usRelId, {
terms: { id: "2" } // Net 30
});

await patchVendorSubsidiaryRelationship(caRelId, {
terms: { id: "3" } // Net 45
});

await patchVendorSubsidiaryRelationship(ukRelId, {
terms: { id: "4" } // Net 60
});

4. Subsidiary-Specific GL Accounts​

// Assign different A/P accounts per subsidiary
await patchVendorSubsidiaryRelationship(usRelId, {
payablesAccount: { id: "20" } // US A/P Account
});

await patchVendorSubsidiaryRelationship(caRelId, {
payablesAccount: { id: "25" } // Canada A/P Account
});

5. Tax Registration per Subsidiary​

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

// Set GST registration for Canada subsidiary
await patchVendorSubsidiaryRelationship(caRelId, {
taxRegistration: { id: "21" } // Canada GST Registration
});

6. Track Vendor Exposure Across Subsidiaries​

// Calculate total exposure to a vendor across all subsidiaries
const relationships = await getVendorSubsidiaryRelationships("entity='789'");

const totalExposure = relationships.reduce((sum, rel) => {
// Use consolidated balances for cross-currency totals
return sum + rel.consolBalance + rel.consolUnbilledOrders;
}, 0);

console.log(`Total vendor exposure: $${totalExposure}`);

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 vendor must have exactly one primary subsidiary
  • The primary subsidiary is set on the main vendor record via the subsidiary field
  • Setting isPrimarySubsidiary=true on a relationship does NOT make it primary
  • To change the primary subsidiary, update the vendor record directly

Required Fields​

  • entity: Vendor 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 - A/P balance in this subsidiary
  • unbilledOrders - Unbilled purchase order total
  • consolBalance - Consolidated balance
  • consolUnbilledOrders - Consolidated unbilled orders

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

Payables Account​

  • The payablesAccount field allows different A/P accounts per subsidiary
  • If not specified, uses the vendor's default payables account
  • Useful for maintaining separate A/P accounts by geography or entity

Payment Terms​

  • Different payment terms can be set for each subsidiary relationship
  • Useful when negotiating different terms based on local markets or regulations
  • If not specified, uses the vendor's default payment terms

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 bills or open purchase orders
  • Consider marking the vendor as inactive for the subsidiary instead

Best Practices​

  • Create subsidiary relationships during vendor onboarding
  • Set appropriate payment terms per subsidiary/region
  • Use tax registrations for VAT/GST compliance
  • Configure subsidiary-specific A/P accounts for proper financial reporting
  • Monitor balances and unbilled orders across subsidiaries
  • Apply consistent classification schemes across subsidiaries

Multi-Currency Considerations​

Currency per Subsidiary​

// US vendor with international operations
const usRel = await createVendorSubsidiaryRelationship({
entity: { id: "789" },
subsidiary: { id: "1" }, // US
currency: { id: "1" } // USD
});

const caRel = await createVendorSubsidiaryRelationship({
entity: { id: "789" },
subsidiary: { id: "2" }, // Canada
currency: { id: "2" } // CAD
});

const ukRel = await createVendorSubsidiaryRelationship({
entity: { id: "789" },
subsidiary: { id: "3" }, // UK
currency: { id: "3" } // GBP
});

Consolidated Reporting​

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

const relationships = await getVendorSubsidiaryRelationships("entity='789'");

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

console.log(`Total A/P across all subsidiaries: $${totalConsolidated}`);

Procurement Across Subsidiaries​

1. Centralized Procurement​

Enable centralized purchasing across multiple entities:

// Set up vendor for all subsidiaries
const subsidiaries = [
{ id: "1", terms: "2" }, // US - Net 30
{ id: "2", terms: "3" }, // Canada - Net 45
{ id: "3", terms: "2" } // UK - Net 30
];

for (const sub of subsidiaries) {
await createVendorSubsidiaryRelationship({
entity: { id: vendorId },
subsidiary: { id: sub.id },
terms: { id: sub.terms }
});
}

2. Regional Pricing​

Set different price books or terms by region:

// North America - volume pricing, longer terms
await patchVendorSubsidiaryRelationship(naRelId, {
terms: { id: "4" } // Net 60
});

// Europe - standard pricing, shorter terms
await patchVendorSubsidiaryRelationship(euRelId, {
terms: { id: "2" } // Net 30
});

3. Vendor Performance Tracking​

Monitor vendor performance across all subsidiaries:

const relationships = await getVendorSubsidiaryRelationships("entity='789'");

// Calculate on-time payment rate, spend volume, etc.
for (const rel of relationships) {
const bills = await getVendorBills(
`entity='${rel.entity.id}' AND subsidiary='${rel.subsidiary.id}'`
);

console.log(`${rel.subsidiary.refName}:`);
console.log(` Total Bills: ${bills.length}`);
console.log(` Current Balance: ${rel.balance}`);
console.log(` Unbilled Orders: ${rel.unbilledOrders}`);
}

See Also​