Section I.1
Integration Overview
Understanding NetSuite's integration options and choosing the right approach for your business requirements.
Integration Methods Comparison
| Method | Best For | Limits | Complexity |
|---|---|---|---|
| REST API (SuiteTalk) | Modern apps, mobile, lightweight | 10 concurrent, rate limited | Medium |
| SOAP Web Services | Legacy systems, bulk operations | 10 concurrent, governance | High |
| RESTlet (SuiteScript) | Custom endpoints, complex logic | Script governance units | High |
| CSV Import | Bulk data, simple transforms | 25K rows standard | Low |
| SuiteApp (Connector) | Pre-built integrations | Vendor-specific | Low-Medium |
| SuiteAnalytics Connect | BI tools, reporting only | Read-only, nightly sync | Low |
Integration Architecture Patterns
PATTERN 1: POINT-TO-POINT (Simple)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββ βββββββββββββββ
β External β βββββ REST/SOAP ββββ β NetSuite β
β System β ββββββββββββββββββββ β β
βββββββββββββββ βββββββββββββββ
Best for: Single integration, low volume
Risk: Hard to scale, no centralized monitoring
PATTERN 2: MIDDLEWARE/iPaaS (Scalable)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββ βββββββββββββββ βββββββββββββββ
β Shopify β ββββ β β ββββ β β
βββββββββββββββ β β β β
βββββββββββββββ β Middleware β β NetSuite β
β Salesforce β ββββ β (Celigo, β ββββ β β
βββββββββββββββ β Boomi) β β β
βββββββββββββββ β β β β
β Amazon β ββββ β β ββββ β β
βββββββββββββββ βββββββββββββββ βββββββββββββββ
Best for: Multiple integrations, complex transforms
Benefits: Centralized logging, error handling, monitoring
PATTERN 3: EVENT-DRIVEN (Real-time)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββ βββββββββββββββ βββββββββββββββ
β External β β Message β β NetSuite β
β System β ββββ β Queue β ββββ β (RESTlet) β
βββββββββββββββ β (SQS/etc) β βββββββββββββββ
βββββββββββββββ
β
βββββββββββββββ
β Worker β
β (process) β
βββββββββββββββ
Best for: High volume, async processing
Benefits: Decoupled, scalable, fault-tolerant Integration Decision Framework
| Requirement | Recommended Approach |
|---|---|
| Real-time sync (< 1 minute) | RESTlet with webhooks, or REST API polling |
| Near real-time (1-15 minutes) | Scheduled script polling, or middleware |
| Batch/bulk (daily) | CSV import, SOAP async, or scheduled sync |
| High volume (>10K records/hour) | SOAP with async operations, or middleware queue |
| Complex transformation | Middleware (Celigo, Boomi) or custom RESTlet |
| Pre-built connector exists | Use SuiteApp connector first, customize if needed |
Section I.2
REST API Patterns
Modern integration using NetSuite's REST API (SuiteTalk REST).
Authentication Setup
OAuth 2.0 (Recommended)
OAUTH 2.0 SETUP STEPS
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1. CREATE INTEGRATION RECORD
Path: Setup β Integration β Manage Integrations β New
Settings:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Name: My REST Integration β
β State: Enabled β
β β
β Authentication: β
β β OAuth 2.0 β
β β Token-Based Authentication (TBA) β
β β
β OAuth 2.0: β
β Authorization Code Grant: β β
β Client Credentials Grant: β (machine-to-machine) β
β Callback URL: https://yourapp.com/oauth/callback β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2. SAVE AND COPY CREDENTIALS
After save:
- Consumer Key (Client ID): Copy immediately
- Consumer Secret (Client Secret): Copy immediately (shown once)
3. GENERATE ACCESS TOKEN
For Client Credentials (M2M):
POST https://{account_id}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&client_id={consumer_key}
&client_secret={consumer_secret}
Response:
{
"access_token": "eyJ0...",
"token_type": "Bearer",
"expires_in": 3600
} Token-Based Authentication (TBA)
TBA SETUP (Legacy but widely used) βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ 1. Enable TBA Feature Path: Setup β Company β Enable Features β SuiteCloud β Token-Based Authentication 2. Create Integration Record (same as OAuth) β Token-Based Authentication 3. Create Access Token Path: Setup β Users/Roles β Access Tokens β New Fields: - Application: [Select your integration] - User: [Integration user with appropriate role] - Token Name: My API Token 4. Copy Credentials (shown once): - Token ID - Token Secret 5. Use in API Calls: Authorization header requires OAuth 1.0 signature (Most libraries handle this automatically)
REST API Examples
Get Customer
GET /services/rest/record/v1/customer/123
Authorization: Bearer {access_token}
Response:
{
"id": "123",
"companyName": "Acme Corp",
"email": "info@acme.com",
"phone": "555-1234",
"subsidiary": {
"id": "1",
"refName": "US Operations"
},
"links": [
{"rel": "self", "href": "/services/rest/record/v1/customer/123"}
]
} Create Sales Order
POST /services/rest/record/v1/salesOrder
Authorization: Bearer {access_token}
Content-Type: application/json
Prefer: respond-async // For large orders
{
"entity": {"id": "123"},
"tranDate": "2024-12-10",
"subsidiary": {"id": "1"},
"location": {"id": "1"},
"item": {
"items": [
{
"item": {"id": "456"},
"quantity": 10,
"price": {"id": "-1"},
"rate": 99.99
},
{
"item": {"id": "789"},
"quantity": 5,
"price": {"id": "-1"},
"rate": 49.99
}
]
},
"customFieldList": {
"customField": [
{
"scriptId": "custbody_source_system",
"value": "Shopify"
}
]
}
}
Response (201 Created):
{
"id": "12345",
"tranId": "SO-12345",
"links": [...]
} Search with SuiteQL
POST /services/rest/query/v1/suiteql
Authorization: Bearer {access_token}
Content-Type: application/json
Prefer: transient
{
"q": "SELECT id, companyName, email, balance
FROM customer
WHERE balance > 1000
AND isinactive = 'F'
ORDER BY balance DESC"
}
Response:
{
"links": [...],
"count": 45,
"hasMore": true,
"offset": 0,
"totalResults": 156,
"items": [
{"id": "101", "companyName": "Big Co", "email": "...", "balance": 50000},
{"id": "205", "companyName": "Medium Inc", "email": "...", "balance": 25000},
...
]
}
// Pagination: Add ?offset=100&limit=100 to URL Rate Limits and Best Practices
| Limit | Value | Mitigation |
|---|---|---|
| Concurrent Requests | 10 per account | Queue requests, use async |
| Requests per Minute | ~100-200 (varies) | Implement exponential backoff |
| Payload Size | 10 MB | Batch into smaller requests |
| SuiteQL Results | 1000 per page | Use pagination (offset/limit) |
RATE LIMIT HANDLING (Exponential Backoff)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
async function callWithRetry(apiCall, maxRetries = 5) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await apiCall();
return response;
} catch (error) {
if (error.status === 429) { // Rate limited
const waitTime = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s, 8s, 16s
console.log(`Rate limited. Waiting ${waitTime}ms`);
await sleep(waitTime);
} else {
throw error; // Non-retryable error
}
}
}
throw new Error('Max retries exceeded');
} Section I.3
SOAP Web Services
Using NetSuite's SOAP-based SuiteTalk for robust enterprise integrations.
SOAP vs REST Decision
| Use SOAP When | Use REST When |
|---|---|
| Bulk operations (add/update list) | Single record CRUD |
| Async processing required | Real-time response needed |
| Legacy system compatibility | Modern web/mobile apps |
| Strict schema validation | Flexible JSON handling |
| Java/.NET enterprise stack | JavaScript/Python/modern stack |
SOAP Endpoint Configuration
SOAP WSDL ENDPOINTS
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Current Version (2024.1):
https://{account_id}.suitetalk.api.netsuite.com/wsdl/v2024_1_0/netsuite.wsdl
Endpoint URL:
https://{account_id}.suitetalk.api.netsuite.com/services/NetSuitePort_2024_1
Account ID Format:
- Production: 1234567 (numeric)
- Sandbox: 1234567_SB1
Headers Required:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β <tokenPassport> β
β <account>{account_id}</account> β
β <consumerKey>{consumer_key}</consumerKey> β
β <token>{token_id}</token> β
β <nonce>{random_string}</nonce> β
β <timestamp>{unix_timestamp}</timestamp> β
β <signature algorithm="HMAC-SHA256">{signature}</signature> β
β </tokenPassport> β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ SOAP Operation Examples
Add Customer (Single)
<add>
<record xsi:type="Customer">
<companyName>Acme Corporation</companyName>
<email>info@acme.com</email>
<phone>555-1234</phone>
<subsidiary internalId="1"/>
<customFieldList>
<customField xsi:type="StringCustomFieldRef" scriptId="custentity_source">
<value>API</value>
</customField>
</customFieldList>
</record>
</add> Add List (Bulk)
<addList>
<record xsi:type="Customer">
<companyName>Customer 1</companyName>
<subsidiary internalId="1"/>
</record>
<record xsi:type="Customer">
<companyName>Customer 2</companyName>
<subsidiary internalId="1"/>
</record>
<!-- Up to 100 records per call -->
</addList>
Response:
<addListResponse>
<writeResponseList>
<writeResponse>
<status isSuccess="true"/>
<baseRef internalId="12345" type="customer"/>
</writeResponse>
<writeResponse>
<status isSuccess="false">
<statusDetail type="ERROR">
<code>DUP_ENTITY</code>
<message>Duplicate entity name</message>
</statusDetail>
</status>
</writeResponse>
</writeResponseList>
</addListResponse> Search with Pagination
<!-- Initial Search -->
<search>
<searchRecord xsi:type="CustomerSearchBasic">
<lastModifiedDate operator="onOrAfter">
<searchValue>2024-01-01T00:00:00</searchValue>
</lastModifiedDate>
</searchRecord>
</search>
<!-- Response includes searchId for pagination -->
<searchResponse>
<searchResult>
<status isSuccess="true"/>
<totalRecords>1500</totalRecords>
<pageSize>1000</pageSize>
<totalPages>2</totalPages>
<pageIndex>1</pageIndex>
<searchId>WEBSERVICES_1234567_12012024...</searchId>
<recordList>...</recordList>
</searchResult>
</searchResponse>
<!-- Get Next Page -->
<searchMoreWithId>
<searchId>WEBSERVICES_1234567_12012024...</searchId>
<pageIndex>2</pageIndex>
</searchMoreWithId> Section I.4
Shopify Integration
Connecting Shopify eCommerce with NetSuite for unified order, inventory, and customer management.
Integration Architecture
SHOPIFY β NETSUITE DATA FLOWS βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ORDERS (Shopify β NetSuite) βββββββββββββββ Webhook βββββββββββββββ Create βββββββββββββββ β Shopify β βββββββββββββ β Middleware β βββββββββββ β NetSuite β β Order β β (Celigo) β β Sales Order β βββββββββββββββ βββββββββββββββ βββββββββββββββ Mapping: Shopify Order β NetSuite Sales Order Shopify Line Items β SO Line Items Shopify Customer β NS Customer (match or create) Shopify Shipping β NS Shipping Item Shopify Discount β NS Discount Item or Price Adjustment INVENTORY (NetSuite β Shopify) βββββββββββββββ Scheduled βββββββββββββββ Update βββββββββββββββ β NetSuite β ββββββββββββ β Middleware β βββββββββββ β Shopify β β Inventory β Sync β β β Inventory β βββββββββββββββ βββββββββββββββ βββββββββββββββ Sync frequency: Every 15 min (typical) Source: Available quantity from NS locations Target: Shopify inventory levels by location PRODUCTS (NetSuite β Shopify) βββββββββββββββ On Change βββββββββββββββ Create/ βββββββββββββββ β NetSuite β ββββββββββββ β Middleware β βββββββββββ β Shopify β β Item β β β Update β Product β βββββββββββββββ βββββββββββββββ βββββββββββββββ Mapping: NS Item β Shopify Product NS Matrix Item β Shopify Variants NS Pricing β Shopify Price NS Images β Shopify Images
Order Sync Configuration
| Shopify Field | NetSuite Field | Notes |
|---|---|---|
| order.id | custbody_shopify_order_id | Custom field for deduplication |
| order.name (#1001) | otherrefnum | PO/Reference number field |
| customer.email | Customer lookup/create | Match on email, create if new |
| line_items.sku | Item lookup | Match on item name/UPC |
| shipping_address | shipaddress (or address sublist) | Validate address format |
| discount_codes | Discount item or rate adjust | Depends on accounting treatment |
| fulfillment_status | Triggers item fulfillment | Bidirectional sync common |
Common Integration Challenges
Inventory Sync Timing
Shopify and NetSuite inventory can drift during high-volume sales. Solution: Implement inventory reservations on order create, or use real-time webhooks with queue-based processing to handle race conditions.
Challenge: SKU/Item Matching
ITEM MATCHING STRATEGY βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Priority Order: 1. Exact SKU match (Shopify SKU = NS Item Name/SKU) 2. UPC/Barcode match 3. Shopify Product ID β NS custom field 4. Manual mapping table NetSuite Custom Fields: custitem_shopify_product_id - Shopify product ID custitem_shopify_variant_id - Shopify variant ID Lookup Logic: IF item found by SKU β use ELSE IF item found by UPC β use ELSE IF mapping exists β use mapped item ELSE β create integration error, flag for review
Challenge: Customer Deduplication
CUSTOMER MATCHING STRATEGY βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Match Hierarchy: 1. custentity_shopify_customer_id (if returning customer) 2. Email address (primary match) 3. Phone number (secondary) 4. Name + Address (fuzzy match - risky) Recommendation: - Match on email first - If no match, create new customer - Store Shopify customer ID on NS customer - Let customer merge handle duplicates later Guest Checkout Handling: - Create customer with email OR - Use generic "Web Customer" with order details
Section I.5
Salesforce Integration
Connecting Salesforce CRM with NetSuite ERP for end-to-end quote-to-cash automation.
Integration Scenarios
| Scenario | Direction | Trigger |
|---|---|---|
| Account/Customer Sync | Bidirectional | Create/Update in either system |
| Contact Sync | Bidirectional | Create/Update in either system |
| Opportunity → Sales Order | SF → NS | Opportunity Closed-Won |
| Quote → Estimate | SF → NS | Quote approval or sync request |
| Invoice → SF | NS → SF | Invoice creation |
| Payment Status | NS → SF | Payment received |
| Product/Item Sync | NS → SF | Product master in NetSuite |
Data Flow Architecture
SALESFORCE β NETSUITE QUOTE-TO-CASH
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
OPPORTUNITY TO ORDER FLOW:
Salesforce Middleware NetSuite
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β Opportunity β β β β β
β Created β β β β Customer β
β β β β β β (verify) β
β Account β βββββββββ β Map/ β ββββββ β β β
β Sync β β Transform β β Estimate β
β β β β β β β β
β Quote β βββββββββ β β ββββββ β Sales Order β
β Created β β β β β β
β β β β β β Invoice β
β Closed-Won β βββββββββ β β ββββββ β β β
ββββββββββββββββ ββββββββββββββββ β Payment β
ββββββββββββββββ
β
β
ββββββββββββββββ
β Invoice β
β Status β
β Back to SF β
ββββββββββββββββ
ID MAPPING (Critical):
SF Account ID β NS Customer (external ID or custom field)
SF Contact ID β NS Contact (external ID)
SF Opportunity β NS Sales Order (custom field)
SF Product ID β NS Item (external ID or SKU) Field Mapping: Account to Customer
| Salesforce Field | NetSuite Field | Notes |
|---|---|---|
| Account.Id | externalId or custentity_sf_id | Primary key for sync |
| Account.Name | companyName | Required |
| Account.Phone | phone | |
| Account.Website | url | |
| Account.BillingAddress | defaultBillingAddress | Address object mapping |
| Account.ShippingAddress | defaultShippingAddress | Address object mapping |
| Account.Industry | category or custom field | Picklist mapping required |
| Account.OwnerId | salesRep | User mapping table |
Integration Patterns
Pattern: Closed-Won → Sales Order
TRIGGER: Opportunity.Stage = 'Closed Won' βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Process Flow: 1. SF sends webhook or middleware polls for Closed-Won opps 2. Middleware retrieves full opportunity with line items 3. Map SF Account β NS Customer (create if needed) 4. Map SF Products β NS Items 5. Create Sales Order in NetSuite 6. Store NS SO internal ID back on SF Opportunity 7. If error, create integration error record for review Error Handling: - Item not found β Flag opportunity, notify sales - Customer create fails β Log error, retry with manual review - Order validation fails β Return validation errors to SF Idempotency: - Check if SO already exists (by SF Opp ID) - If exists, update instead of create - Prevent duplicate orders on webhook retries
SuiteApp: NetSuite Connector for Salesforce
Before building custom integration, evaluate NetSuite's native Salesforce Connector SuiteApp. It handles common scenarios out of the box with configuration, not code. Custom integration recommended only for complex requirements.
Section I.6
Amazon & Marketplace Integration
Connecting Amazon, eBay, Walmart, and other marketplaces with NetSuite.
Marketplace Integration Overview
| Marketplace | Recommended Approach | Key Consideration |
|---|---|---|
| Amazon (Seller Central) | Celigo, FarApp, or custom via SP-API | MCF (Multi-Channel Fulfillment) |
| Amazon (Vendor Central) | EDI via SPS Commerce or similar | EDI 850/855/856 compliance |
| eBay | Celigo, ChannelAdvisor | Listing management |
| Walmart | EDI required, SPS Commerce | Strict compliance requirements |
| Multi-marketplace | ChannelAdvisor, Feedonomics | Centralized listing/inventory |
Amazon Seller Central Flow
AMAZON SELLER CENTRAL β NETSUITE
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ORDER FLOW:
Amazon Middleware NetSuite
ββββββββββββ ββββββββββββ ββββββββββββ
β Order β βββββ β Polling β βββββββ β Sales β
β Created β β or Push β β Order β
ββββββββββββ ββββββββββββ ββββββββββββ
β
β
ββββββββββββ
β Item β
β Fulfill β
ββββββββββββ
β
ββββββββββββ β
β Shipment β βββββββ ββββββββββββ
β Confirm β β Tracking β
ββββββββββββ ββββββββββββ
INVENTORY FLOW:
NetSuite Middleware Amazon
ββββββββββββ ββββββββββββ ββββββββββββ
β Available β βββββββββ β Calculate β ββββββββ β Inventoryβ
β Quantity β β Available β β Feed β
ββββββββββββ β for Amazonβ ββββββββββββ
ββββββββββββ
Available = On Hand - Committed - Safety Stock - Other Channels
FBA (Fulfillment by Amazon):
- Track FBA inventory as separate NS location
- Receive inbound shipments as transfers TO FBA location
- Sales from FBA = transfers FROM FBA location
- Or use FBA receipts from settlement reports Multi-Channel Inventory Strategy
INVENTORY ALLOCATION STRATEGY βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Total Available in NetSuite: 1000 units Channel Allocation: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β Channel β % Allocation β Units β Buffer β Advertised β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β Website (Shopify)β 40% β 400 β 20 β 380 β β Amazon β 30% β 300 β 15 β 285 β β eBay β 15% β 150 β 10 β 140 β β Walmart β 10% β 100 β 10 β 90 β β Reserve/Safety β 5% β 50 β - β - β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Buffer = Safety stock per channel to prevent oversell Dynamic Reallocation: - If Amazon inventory < 50 and Website > 200 - Reallocate 50 units from Website to Amazon - Prevents stockouts on high-velocity channels Implementation: - Custom NetSuite saved search for available by location - Scheduled script to calculate and push to channels - Or use channel management tool (ChannelAdvisor, etc.)
Section I.7
EDI Integration
Electronic Data Interchange for B2B trading partner automation.
Common EDI Documents
| EDI # | Document | NetSuite Equivalent | Direction |
|---|---|---|---|
| 850 | Purchase Order | Sales Order | Inbound |
| 855 | PO Acknowledgment | SO Confirmation | Outbound |
| 856 | Advance Ship Notice (ASN) | Item Fulfillment | Outbound |
| 810 | Invoice | Invoice | Outbound |
| 820 | Payment Order/Remittance | Customer Payment | Inbound |
| 846 | Inventory Inquiry | Inventory report | Outbound |
| 860 | PO Change | SO Update | Inbound |
EDI Architecture
EDI ARCHITECTURE OPTIONS
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
OPTION 1: VAN (Value-Added Network)
Trading Partner β VAN β EDI Translator β NetSuite
(SPS, TrueCommerce)
Pros: Managed connectivity, compliance monitoring
Cons: Per-document fees, VAN dependency
OPTION 2: Direct (AS2)
Trading Partner β AS2 Gateway β EDI Translator β NetSuite
Pros: No per-document fees, lower long-term cost
Cons: Manage own connectivity, higher setup
TYPICAL EDI STACK FOR NETSUITE:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Trading Partner β
β β EDI X12 β
β βββββββββββββββββββ β
β β VAN / AS2 β SPS Commerce, TrueCommerce, etc. β
β βββββββββββββββββββ β
β β XML/JSON β
β βββββββββββββββββββ β
β β EDI Translator β Built into VAN or separate (Dell Boomi) β
β βββββββββββββββββββ β
β β NetSuite format β
β βββββββββββββββββββ β
β β Integration β SuiteApp, Celigo, or custom RESTlet β
β βββββββββββββββββββ β
β β β
β βββββββββββββββββββ β
β β NetSuite β β
β βββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ EDI Implementation Checklist
☐
Identify trading partners and their EDI requirements
☐
Select VAN/connectivity method (SPS, TrueCommerce, direct)
☐
Map EDI documents to NetSuite transactions
☐
Create custom fields for EDI identifiers (ISA, GS, PO#)
☐
Set up item cross-reference (UPC, vendor SKU)
☐
Configure trading partner records in NetSuite
☐
Test with each trading partner (997 acknowledgments)
☐
Document error handling and escalation procedures
Section I.8
Middleware Platforms
Integration Platform as a Service (iPaaS) solutions for NetSuite.
Platform Comparison
| Platform | Best For | NetSuite Connector | Pricing Model |
|---|---|---|---|
| Celigo integrator.io | NetSuite-centric orgs | Native, excellent | Per flow/connection |
| Dell Boomi | Enterprise, complex | Good, requires config | Enterprise licensing |
| Workato | Business user friendly | Good | Per recipe/connection |
| MuleSoft | Large enterprise, API-led | Connector available | Enterprise licensing |
| Zapier | Simple, low volume | Basic | Per task |
| Make (Integromat) | Mid-market, visual | Basic | Per operation |
Celigo integrator.io Overview
CELIGO ARCHITECTURE βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β CELIGO INTEGRATOR.IO β β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β β FLOWS β β IMPORTS β β EXPORTS β β β β (workflows) β β (to NS) β β (from NS) β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β β β β β β β β β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β MAPPING / TRANSFORMATION β β β β Handlebars templates, lookups, defaults β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β β β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β ERROR HANDLING β β β β Retry, manual resolution, alerts β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β β β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β MONITORING / LOGGING β β β β Dashboard, audit trail, notifications β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ KEY CONCEPTS: Flow: End-to-end integration (e.g., Shopify Order β NS SO) Export: Pull data from source system Import: Push data to destination system Lookup: Reference data resolution (e.g., customer match) Mapping: Field-by-field transformation PRE-BUILT INTEGRATION APPS: - Shopify - NetSuite - Salesforce - NetSuite - Amazon - NetSuite - 3PL/WMS - NetSuite - Many more on Celigo marketplace
Middleware Selection Criteria
☐
NetSuite connector quality - Native SuiteTalk support, custom field handling
☐
Pre-built templates - Existing flows for your integrations (Shopify, SF, etc.)
☐
Error handling - Retry logic, manual resolution, alerting
☐
Monitoring/logging - Audit trail, dashboards, SLA tracking
☐
Transformation power - Complex mapping, lookups, scripting
☐
Volume/performance - Throughput limits, concurrent processing
☐
Pricing model fit - Per flow, per record, flat fee
☐
Support/community - Documentation, partner ecosystem
Section I.9
Integration Best Practices
Design patterns and operational guidelines for robust NetSuite integrations.
Design Principles
INTEGRATION DESIGN PRINCIPLES
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1. IDEMPOTENCY
- Same request twice = same result
- Use external IDs to prevent duplicates
- Check-before-create pattern
Example:
if (existingRecord = findByExternalId(externalId)) {
return update(existingRecord);
} else {
return create(newRecord);
}
2. ERROR HANDLING
- Assume failures will happen
- Log everything (request, response, errors)
- Implement retry with exponential backoff
- Alert on repeated failures
3. DATA VALIDATION
- Validate at source before sending to NS
- Fail fast with clear error messages
- Don't rely on NS validation alone
4. MONITORING
- Track success/failure rates
- Monitor latency
- Set up alerts for anomalies
- Review logs regularly
5. SCALABILITY
- Design for 10x current volume
- Use async processing where possible
- Batch operations when appropriate
- Respect rate limits External ID Strategy
EXTERNAL ID BEST PRACTICES
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
What is External ID?
- Unique identifier from source system
- Stored on NetSuite record
- Enables upsert (update if exists, insert if new)
- Prevents duplicates
Format Recommendations:
[SOURCE]_[ID]
Examples:
- SF_0015000000abcDE (Salesforce Account)
- SHOP_12345678 (Shopify Order)
- AMZ_113-1234567-1234567 (Amazon Order)
Implementation:
// REST API - use externalId in URL
PUT /services/rest/record/v1/customer/eid:SF_0015000000abcDE
// SOAP - upsert operation
<upsert>
<record xsi:type="Customer" externalId="SF_0015000000abcDE">
<companyName>Updated Name</companyName>
</record>
</upsert>
Custom Field Alternative:
If externalId field unavailable, use custom field:
custentity_source_system_id
Search before create:
1. Search by custom field
2. If found, update
3. If not found, create with custom field set Error Handling Patterns
| Error Type | Handling Strategy | Example |
|---|---|---|
| Transient (5xx, timeout) | Retry with backoff | Network error, NS maintenance |
| Rate Limit (429) | Queue, retry after delay | Too many requests |
| Validation (400) | Log, alert, manual review | Missing required field |
| Not Found (404) | Create or flag for review | Referenced record missing |
| Auth (401/403) | Refresh token, alert if persists | Expired credentials |
| Duplicate | Lookup existing, update | Record already exists |
Integration Testing Checklist
☐
Test in sandbox first (always)
☐
Verify happy path with sample data
☐
Test error scenarios (bad data, missing refs)
☐
Test duplicate handling (send same record twice)
☐
Test update/delta scenarios
☐
Load test with production-like volume
☐
Test recovery after failure (retry, resume)
☐
Verify logging captures needed info
☐
Test alerting (trigger a failure, confirm alert)
☐
Document rollback/recovery procedures
Go-Live Checklist
☐
Production credentials configured (separate from sandbox)
☐
Monitoring/alerting configured for production
☐
Support team trained on error resolution
☐
Runbook documented (common issues, solutions)
☐
Historical data migrated/reconciled
☐
Cutover plan documented (disable old, enable new)
☐
Rollback plan in place
☐
Business users notified of go-live
