Skip to main content

Netsuite

Learn how to automate NetSuite operations using Abstra connectors through practical, focused tutorials.

Getting Started​

Prerequisites​

  • NetSuite account with API access
  • NetSuite credentials (Account ID, Consumer Key/Secret, Token ID/Secret)
  • Abstra project

Quick Setup​

  1. Add NetSuite connector in Abstra Console
  2. Enter your credentials
  3. Enable required resources:
    • suiteQL - Query data
    • fileCabinet - File operations
    • soap - Attach operations
    • rest/purchaseOrder - Purchase order management

Test your connection:

from abstra.connectors import run_connection_action

result = run_connection_action(
"netsuite",
"query",
{"query": "SELECT COUNT(*) as total FROM vendor"}
)
print(f"✓ Connection works! Total vendors: {result['data']['items'][0]['total']}")

📁 File Cabinet Tutorials​

Learn how to manage files in NetSuite File Cabinet:

1. Uploading Files​

Upload files to NetSuite with proper encoding, folder management, and error handling.

You'll learn:

  • Basic file upload
  • Upload to specific folders
  • Supported file types
  • Batch uploads
  • Error handling
# Quick example
with open("document.pdf", "rb") as f:
content = base64.b64encode(f.read()).decode('utf-8')

result = run_connection_action("netsuite", "add_file", {
"name": "document.pdf",
"content": content,
"fileType": "PDF"
})

2. Searching Files​

Find files using SuiteQL queries with various search criteria.

You'll learn:

  • Search by name, date, type, size
  • Complex queries with multiple criteria
  • Pagination techniques
  • Count and aggregate queries
# Quick example
result = run_connection_action("netsuite", "query", {
"query": """
SELECT id, name, filesize
FROM File
WHERE name LIKE '%invoice%'
FETCH FIRST 10 ROWS ONLY
"""
})

3. Retrieving and Updating Files​

Get file details, download content, update properties, and delete files.

You'll learn:

  • Retrieve file information
  • Download file content
  • Update file properties
  • Replace file content
  • Delete files safely
  • Bulk operations
# Quick example - get file details
file_details = run_connection_action("netsuite", "get_file", {
"fileId": "654321"
})
print(f"File: {file_details['data']['name']}")

4. Attaching Files to Records​

Link files to purchase orders, invoices, customers, and other NetSuite records.

You'll learn:

  • Attach files to different record types
  • Upload and attach workflow
  • Attach multiple files
  • Share files across records
  • Error handling
# Quick example
run_connection_action("netsuite", "attach", {
"attachTo": {"type": "purchaseOrder", "internalId": "501628"},
"attachedRecord": {"type": "file", "internalId": "654321"}
})

5. Searching Files Attached to Records​

Find files attached to transactions using SOAP Advanced Search.

You'll learn:

  • Search files attached via SOAP attach
  • Query attachments by transaction ID
  • Handle different transaction types
  • Download attached file content
  • Compare SuiteQL vs SOAP approaches
# Quick example - find files attached to a PO
result = run_connection_action("netsuite", "search_transaction_files", {
"transactionId": "670932",
"transactionType": "purchaseOrder"
})
for file in result['data']['files']:
print(f"{file['fileName']} ({file['fileType']})")

📋 Purchase Order Tutorials​

Master purchase order operations in NetSuite:

1. Searching Purchase Orders​

Find and filter purchase orders using various criteria.

You'll learn:

  • Search by status, date, vendor
  • Filter multiple statuses
  • Group and aggregate
  • Pagination for large datasets
  • Build reusable search functions
# Quick example - find pending approval orders
result = run_connection_action("netsuite", "query", {
"query": """
SELECT t.id, t.tranid, t.trandate, ts.name as status
FROM transaction t
LEFT JOIN TransactionStatus ts ON t.status = ts.id
WHERE t.type = 'PurchOrd' AND ts.name = 'Pending Approval'
ORDER BY t.trandate DESC
"""
})

2. Reading Purchase Order Details​

Retrieve complete purchase order information including all fields and relationships.

You'll learn:

  • Get PO by ID or number
  • Understand standard fields
  • Parse approval status
  • Read financial details
  • Get vendor information
  • Export to JSON/CSV
# Quick example - get complete PO details
result = run_connection_action("netsuite", "query", {
"query": """
SELECT t.*, ts.name as status_name, v.companyname as vendor_name
FROM transaction t
LEFT JOIN TransactionStatus ts ON t.status = ts.id
LEFT JOIN vendor v ON t.entity = v.id
WHERE t.tranid = 'PO2024-001' AND t.type = 'PurchOrd'
"""
})

3. Filtering by Custom Fields​

Search and filter purchase orders using company-specific custom fields.

You'll learn:

  • Discover available custom fields
  • Filter by department, cost center, project
  • Search by approver or creator
  • Filter by amount ranges
  • Handle NULL custom fields
  • Build flexible search functions
# Quick example - filter by department and approver
result = run_connection_action("netsuite", "query", {
"query": """
SELECT t.id, t.tranid, t.custbody7 as department,
t.custbody15 as approver, ts.name as status
FROM transaction t
LEFT JOIN TransactionStatus ts ON t.status = ts.id
WHERE t.type = 'PurchOrd'
AND t.custbody7 = '5'
AND t.custbody15 = '789'
AND ts.name = 'Pending Approval'
"""
})

4. Creating Purchase Orders​

Complete workflow for creating purchase orders and attaching supporting documents.

You'll learn:

  • Query for required IDs (vendors, items, subsidiaries)
  • Create purchase orders via REST API
  • Upload files
  • Attach files to purchase orders
  • Handle errors
  • Complete end-to-end workflow
# Quick example - create PO
po_result = run_connection_action("netsuite", "post_purchase_order", {
"data": {
"entity": {"id": vendor_id},
"subsidiary": {"id": subsidiary_id},
"tranDate": "2025-01-01",
"item": {
"items": [{
"item": {"id": item_id},
"quantity": 10,
"rate": 50.00
}]
}
}
})

Common Patterns​

Upload and Attach Pattern​

import base64

# 1. Upload file
with open("contract.pdf", "rb") as f:
content = base64.b64encode(f.read()).decode('utf-8')

file_result = run_connection_action("netsuite", "add_file", {
"name": "contract.pdf",
"content": content,
"fileType": "PDF"
})

# 2. Attach to record
run_connection_action("netsuite", "attach", {
"attachTo": {"type": "purchaseOrder", "internalId": po_id},
"attachedRecord": {"type": "file", "internalId": file_result['data']['id']}
})

Search and Process Pattern​

# 1. Find files
files = run_connection_action("netsuite", "query", {
"query": "SELECT id, name FROM File WHERE name LIKE '%invoice%'"
})

# 2. Process each file
for file in files['data']['items']:
details = run_connection_action("netsuite", "get_file", {
"fileId": str(file['id'])
})
# ... process file

Bulk Operations Pattern​

def process_files_in_batches(file_ids, operation, batch_size=10):
for i in range(0, len(file_ids), batch_size):
batch = file_ids[i:i + batch_size]
for file_id in batch:
run_connection_action("netsuite", operation, {"fileId": file_id})
time.sleep(1) # Rate limiting

Quick Reference​

File Operations​

ActionPurposeKey Parameters
add_fileUpload filename, content, fileType
get_fileGet file detailsfileId
update_fileUpdate filefileId, fields to update
delete_fileDelete filefileId
attachAttach file to recordattachTo, attachedRecord
search_transaction_filesSearch files attached to transactiontransactionId, transactionType
querySearch filesquery (SuiteQL)

Common File Types​

TypeValue
PDFPDF
ExcelEXCEL
WordWORD
Plain TextPLAINTEXT
JavaScriptJAVASCRIPT
CSVCSV
PNGPNGIMAGE
JPEGJPGIMAGE

Common Record Types​

RecordType Value
Purchase OrderpurchaseOrder
Sales OrdersalesOrder
Invoiceinvoice
Vendor BillvendorBill
Customercustomer
Vendorvendor

Best Practices​

File Naming​

# ✅ Good: Descriptive with date
f"invoice_vendor123_{datetime.now().strftime('%Y%m%d')}.pdf"

# ❌ Bad: Generic
"document.pdf"

Error Handling​

try:
result = run_connection_action("netsuite", "add_file", params)
except Exception as e:
print(f"Error: {str(e)}")

Base64 Encoding​

# ✅ Always use binary mode
with open("file.pdf", "rb") as f:
content = base64.b64encode(f.read()).decode('utf-8')

SuiteQL Queries​

# ✅ Use FETCH FIRST (not LIMIT)
"SELECT id FROM File FETCH FIRST 10 ROWS ONLY"

# ✅ File types have underscore prefix
"WHERE filetype = '_PDF'"

Troubleshooting​

"Action attach not found"​

  • Enable soap resource in your NetSuite connection configuration

"File size exceeds limit"​

  • NetSuite SOAP API has a 10MB file size limit

"Invalid file type"​

  • Ensure fileType parameter matches actual file content
  • Use uppercase: PDF, EXCEL, PLAINTEXT

"Unknown identifier" in SuiteQL​

  • Use FETCH FIRST N ROWS ONLY instead of LIMIT N
  • File types in queries need underscore: _PDF, _EXCEL

"Permission denied"​

  • Check NetSuite role has File Cabinet permissions
  • Verify user has Attach Files to Records permission

Resources​

Need Help?​

  • Check the specific tutorial for detailed examples
  • Review error messages in troubleshooting sections
  • Test with small files first
  • Verify credentials and permissions