Vendor Subsidiary Relationship API
In OneWorld accounts, manage which subsidiaries a vendor can transact with.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET | /record/v1/vendorSubsidiaryRelationship | List relationships |
GET | /record/v1/vendorSubsidiaryRelationship/{id} | Get specific relationship |
POST | /record/v1/vendorSubsidiaryRelationship | Create 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
| Field | Type | Description | Required |
|---|---|---|---|
id | string | Internal ID (read-only) | - |
entity | object | Vendor reference | Yes |
subsidiary | object | Subsidiary reference | Yes |
isPrimarySubsidiary | boolean | Primary subsidiary flag | No |
Financial Fields (Read-Only)
| Field | Type | Description |
|---|---|---|
balance | number | A/P balance in this subsidiary |
unbilledOrders | number | Unbilled purchase order total |
consolBalance | number | Consolidated balance |
consolUnbilledOrders | number | Consolidated unbilled orders |
Tax & Payment Fields
| Field | Type | Description |
|---|---|---|
taxRegistration | object | Tax registration for subsidiary |
payablesAccount | object | A/P account for this subsidiary |
currency | object | Transaction currency |
terms | object | Payment terms for this subsidiary |
Classification Fields
| Field | Type | Description |
|---|---|---|
class | object | Class for this subsidiary |
department | object | Department for this subsidiary |
location | object | Location 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
subsidiaryfield - Setting
isPrimarySubsidiary=trueon 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 subsidiaryunbilledOrders- Unbilled purchase order totalconsolBalance- Consolidated balanceconsolUnbilledOrders- 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
payablesAccountfield 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
- Vendor - Main vendor record
- Subsidiary - Subsidiary setup
- Customer Subsidiary Relationship - Similar for customers
- Currency - Multi-currency setup
- Purchase Order - Create purchase orders
- Vendor Bill - Process vendor bills