Install any skill in seconds. Free to start, no credit card required.
Get Started Free →NetSuite Automation: manage customers, sales orders, invoices, inventory, and records via Oracle NetSuite ERP with SuiteQL queries
.claude/skills/openteams-lab-netsuite-automation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 144% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 313% | 0% |
| case-04 | ✓→✗ | ▼ Worse | 37% | 0% |
Automate Oracle NetSuite ERP operations including creating customers and sales orders, running SuiteQL queries, upserting records by external ID, and inspecting record metadata for comprehensive business management.
Toolkit docs: composio.dev/toolkits/netsuite
This skill requires the Rube MCP server connected at https://rube.app/mcp.
Before executing any tools, ensure an active connection exists for the netsuite toolkit. If no connection is active, initiate one via RUBE_MANAGE_CONNECTIONS.
Create customer orders with line items including item references, quantities, and pricing.
Tool: NETSUITE_CREATE_SALES_ORDER
Key Parameters:
entity (required) -- Customer reference: {"id": "<internal_id>"}item (required) -- Container with items array, each containing:item (required) -- Item reference: {"id": "<internal_id>"}quantity (required) -- Units to order (non-negative)rate -- Unit price (optional if item has default pricing)amount -- Total line amount (alternative to rate)taxcode -- Tax code reference: {"id": "<internal_id>"} (required if SuiteTax enabled)description -- Line item notestranDate -- Transaction date in YYYY-MM-DD formatmemo -- Header memoorderStatus -- "A" (Pending Approval) or "B" (Pending Fulfillment)otherrefnum -- External reference or PO numberExample:
Tool: NETSUITE_CREATE_SALES_ORDER
Arguments:
entity: {"id": "1234"}
item: {
"items": [
{"item": {"id": "56"}, "quantity": 10, "rate": 25.00},
{"item": {"id": "78"}, "quantity": 5, "rate": 50.00}
]
}
tranDate: "2026-02-11"
memo: "Q1 bulk order"
orderStatus: "B"Execute ad-hoc SQL queries against NetSuite data with server-side paging.
Tool: NETSUITE_RUN_SUITEQL_QUERY
Key Parameters:
q (required) -- SuiteQL SELECT statementlimit -- Rows per page (default varies)offset -- Zero-based index of first row (must be a multiple of limit)Examples:
Tool: NETSUITE_RUN_SUITEQL_QUERY
Arguments:
q: "SELECT id, companyname, email FROM customer WHERE isinactive = 'F' ORDER BY companyname"
limit: 100
offset: 0Tool: NETSUITE_RUN_SUITEQL_QUERY
Arguments:
q: "SELECT id, entitystatus, total FROM transaction WHERE type = 'SalesOrd' AND trandate >= '2026-01-01'"
limit: 50Create new customer records with subsidiary assignment and contact details.
Tools:
NETSUITE_CREATE_CUSTOMER -- Create a new customerNETSUITE_GET_CUSTOMER -- Retrieve customer by internal IDNETSUITE_UPDATE_CUSTOMER -- Update existing customer (PATCH semantics)Key Parameters for NETSUITE_CREATE_CUSTOMER:
body (required) -- JSON object with customer data. Required fields:subsidiary -- Object with id (subsidiary internal ID)companyName (for businesses) or firstName + lastName (for individuals)email, phone, isPerson (set to "T" for individuals), commentsreplace -- Comma-separated sublist names to fully replace (e.g., "contacts,addressbook")Example:
Tool: NETSUITE_CREATE_CUSTOMER
Arguments:
body: {
"companyName": "Acme Corp",
"subsidiary": {"id": "1"},
"email": "info@acme.com",
"phone": "555-0100"
}Create or update records idempotently using an external identifier. Essential for sync workflows.
Tool: NETSUITE_UPSERT_RECORD_BY_EXTERNAL_ID
Key Parameters:
record_type (required) -- Record type name, e.g., "customer", "salesorder", "customrecord_myrec"external_id (required) -- External ID value (letters, numbers, underscore, hyphen only)body (required) -- JSON object matching the record schema; include mandatory fields when creatingExample:
Tool: NETSUITE_UPSERT_RECORD_BY_EXTERNAL_ID
Arguments:
record_type: "customer"
external_id: "CRM-CUST-42"
body: {
"companyName": "Acme Corp",
"subsidiary": {"id": "1"},
"email": "updated@acme.com"
}> Warning: Idempotency depends on consistent external ID usage. Mismatches silently create additional records instead of updating.
Discover available fields, data types, constraints, and requirements before creating or updating records.
Tool: NETSUITE_GET_RECORD_METADATA
Key Parameters:
record_type (required) -- e.g., "customer", "salesorder", "invoice", "vendor", "employee", "item"accept -- "application/schema+json" (default, JSON Schema) or "application/swagger+json" (OpenAPI 3.0)Example:
Tool: NETSUITE_GET_RECORD_METADATA
Arguments:
record_type: "salesorder"Retrieve multiple records with optional filtering and pagination.
Tool: NETSUITE_LIST_RECORDS
Key Parameters:
recordType (required) -- e.g., "customer", "salesorder"q -- Filter expression using N/query operators, e.g., "email START_WITH \"barbara\""limit -- Max records per page (1--1000, default 1000)offset -- Zero-based index (must be divisible by limit)Supporting Tools:
NETSUITE_FILTER_RECORD_COLLECTION -- Alternative filtering (secondary to SuiteQL)NETSUITE_GET_RECORD_SELECTED_FIELDS -- Retrieve specific fields only (reduced payload)NETSUITE_GET_RECORD_METADATA to discover required fieldsNETSUITE_RUN_SUITEQL_QUERY to avoid duplicatesNETSUITE_GET_CUSTOMER if foundNETSUITE_CREATE_CUSTOMER (ensure subsidiary is set)NETSUITE_LIST_RECORDS or SuiteQLNETSUITE_CREATE_SALES_ORDER with validated referencesNETSUITE_UPSERT_RECORD_BY_EXTERNAL_ID for sync workflowsNETSUITE_GET_RECORD_SELECTED_FIELDS to confirm pricing/totals| Pitfall | Detail | |---------|--------| | Invalid item IDs | NETSUITE_CREATE_SALES_ORDER throws USER_ERROR when item internal ID is invalid. Pre-validate via NETSUITE_LIST_RECORDS or NETSUITE_RUN_SUITEQL_QUERY. | | Missing required fields | NETSUITE_CREATE_CUSTOMER returns 400 when required fields (e.g., subsidiary) are missing. Always inspect with NETSUITE_GET_RECORD_METADATA first. | | SuiteQL field names | Query differences by account can cause empty results. Confirm field names via NETSUITE_GET_RECORD_METADATA when results look wrong. | | Filter expression limits | NETSUITE_FILTER_RECORD_COLLECTION may fail if filter syntax is unsupported. Treat as secondary to SuiteQL. | | External ID idempotency | NETSUITE_UPSERT_RECORD_BY_EXTERNAL_ID depends on consistent external IDs. Mismatches silently create duplicates instead of updating. | | SuiteTax line items | Accounts with SuiteTax enabled require taxcode on every line item. Omitting it causes creation failures. |
| Tool Slug | Description | |-----------|-------------| | NETSUITE_CREATE_SALES_ORDER | Create a new sales order with line items | | NETSUITE_RUN_SUITEQL_QUERY | Execute ad-hoc SuiteQL queries with paging | | NETSUITE_CREATE_CUSTOMER | Create a new customer record | | NETSUITE_GET_CUSTOMER | Retrieve a customer by internal ID | | NETSUITE_UPDATE_CUSTOMER | Update an existing customer (PATCH) | | NETSUITE_UPSERT_RECORD_BY_EXTERNAL_ID | Create or update a record by external ID | | NETSUITE_GET_RECORD_METADATA | Inspect record schema and field definitions | | NETSUITE_LIST_RECORDS | List records with filtering and pagination | | NETSUITE_FILTER_RECORD_COLLECTION | Alternative record filtering | | NETSUITE_GET_RECORD_SELECTED_FIELDS | Retrieve specific fields from a record |
Powered by Composio
Other measured skills in the registry, with their headline benchmark lift.