Netsuite Skinny
Overview
This document specifies the technical requirements for building a bidirectional integration between NetSuite (ERP / OMS) and ShipBob (3PL / fulfillment) for Skinny Mixes.
The integration consists of three primary data flows:
Note on order delay: If Skinny Mixes experiences a high volume of order cancellations within the first hour of order creation, add a 1-hour order delay before syncing orders to ShipBob. It may be preferable to implement this delay in the Shopify ↔ NetSuite layer before orders even reach this integration.
Sync 1: Order Sync (NetSuite → ShipBob)
Overview
When a Sales Order in NetSuite reaches Pending Fulfillment status, the integration should create a corresponding order in ShipBob via the Orders API.
Trigger Condition
Frequency
- Recommended for Skinny Mixes: Every 15 minutes
- Alternatives: Every 30 minutes or every 60 minutes
Optional: Order Delay
If Skinny Mixes has a high cancellation rate within the first hour of order creation, add a 1-hour delay before syncing to ShipBob. This can be implemented in either:
- The Shopify ↔ NetSuite sync (preferred), or
- This integration layer by filtering out orders created less than 60 minutes ago
API Endpoint
Required Headers:
Field Mapping
Example Request
Important Notes
reference_idis the idempotency key. If you submit two orders with the samereference_id+shipbob_channel_id, ShipBob will return a422error. Use the NetSuite Sales Order internal ID.products[].reference_idmust match the SKU of a product already created in ShipBob. If the product does not exist, the order will go intoImportReviewstatus.- Pass
"sales_channel": "faire"for Faire marketplace orders, or"shopify"for Shopify orders.
Order Cancellation
Orders can be cancelled in ShipBob if they have not yet been Picked.
To cancel a specific shipment within a split order:
Once a shipment reaches Picked status, it cannot be cancelled via API.
Sync 2: Tracking Sync (ShipBob → NetSuite)
Overview
When an order ships from ShipBob, retrieve the tracking number and carrier information and create an Item Fulfillment record in NetSuite.
Frequency
- Recommended for Skinny Mixes: Every 15–30 minutes
Workflow
Step A: Poll for Shipped Orders
Key Query Parameters:
Check the total-count or total-pages response header to determine if pagination is needed.
Step B: Handle Split Shipments
An order may have multiple shipments if:
- Inventory is stocked at multiple ShipBob fulfillment centers
- Items don’t fit in a single box due to size/weight
Always loop through order.shipments[] and sync each tracking number individually.
Step C: Create Item Fulfillment in NetSuite
For each ShipBob shipment with tracking, create a NetSuite Item Fulfillment record linked to the originating Sales Order.
Suggested NetSuite Item Fulfillment field mapping:
Step D: Mark Tracking as Synced
After successfully creating the Item Fulfillment in NetSuite, mark the ShipBob shipment as uploaded to prevent re-processing on the next poll cycle.
Webhook Option (Alternative to Polling)
For real-time tracking updates, subscribe to the order.shipped ShipBob webhook event:
- Via Dashboard: Integrations > Webhooks > Add Subscription
- Via API:
POST /webhook
ShipBob webhooks use exponential backoff and retry delivery for up to 24 hours. Recommendation: Use webhooks for real-time updates with polling as a fallback safety net.
Reference: https://developer.shipbob.com/webhooks
Sync 3: Product Sync (NetSuite → ShipBob)
Overview
Sync product/variant data from NetSuite to ShipBob to ensure SKUs exist in ShipBob before orders are submitted. Products must exist in ShipBob before orders referencing their SKUs can be fulfilled.
Frequency
- Recommended: Every 60 minutes (adjust based on catalog change frequency)
API Endpoint
Field Mapping
Example Request
Product Sync Logic
API Reference
Full API reference: https://developer.shipbob.com
Error Handling
Testing Checklist
Sandbox Testing Steps
1. Verify sandbox access
- Log in to ShipBob sandbox at
https://webstage.shipbob.dev - Add a test credit card payment method
2. Get channel ID
-
GET /2026-01/channel→ confirm channel ID168384
3. Create a test product
-
POST /2026-01/productwith a Skinny Mixes SKU - Verify product appears in ShipBob dashboard
4. Create a test order
-
POST /2026-01/orderusing the product SKU from above - Confirm
reference_idmaps to a NetSuite Sales Order internal ID - Confirm
order_numbermaps to the NetSuite SO number (e.g.,SO2)
5. Simulate shipment
- Using the shipment ID from the create order response, simulate shipping:
6. Test tracking sync
-
GET /2026-01/order?HasTracking=true&IsTrackingUploaded=false - Verify the test order appears in results with a tracking number
- Confirm a NetSuite Item Fulfillment record is created
-
POST /2026-01/shipment:batchUpdateTrackingUploadto mark as synced - Re-run poll and confirm the order no longer appears
7. Test duplicate order prevention
- Submit the same order
reference_ida second time - Confirm a
422error is returned and handled gracefully
8. Test order cancellation
- Create an order, then cancel it before it is picked
- Verify cancellation via
POST /order/{id}/cancel
Additional Resources
- ShipBob Developer Docs: https://developer.shipbob.com
- Build Orders Integration Guide: https://developer.shipbob.com/guides/build-orders-integration
- Sandbox Setup: https://developer.shipbob.com/sandbox/setup
- Sandbox Simulations: https://developer.shipbob.com/sandbox/simulations
- Status Reference: https://developer.shipbob.com/status-reference
- Webhooks: https://developer.shipbob.com/webhooks
- API Rate Limits: https://developer.shipbob.com/rate-limit
Questions? Contact Simon Gondeck at ShipBob — happy to jump on a call anytime.

