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