The problem
A Shopify store that outgrows manual export files starts to hurt NetSuite in very specific ways. Someone downloads a CSV of yesterday's orders and imports it, so the Sales Order record is created a day late and the revenue lands in the wrong period. Inventory in Shopify is a number a person typed in on Monday, so the store oversells an item that NetSuite already committed to a wholesale order. Shopify's payout deposits arrive as a single lump sum that nobody can reconcile against individual orders, because the gateway fees, refunds and chargebacks are netted inside it. Customer records duplicate every time a shopper checks out with a slightly different email casing. Fulfilment tracking numbers live in the 3PL portal and never make it back to the shopper.
None of this is a Shopify problem or a NetSuite problem. It is an absence of a reliable, auditable pipe between the two.
What ECOSIRE builds
ECOSIRE builds a bidirectional integration as a native NetSuite customization — SuiteScript 2.1, custom records, saved searches and SuiteFlow — delivered as an unmanaged bundle or an SDF project that you own outright. There is no external middleware tenant to subscribe to and no data hop through a third party's servers. The scripts run inside your NetSuite account and talk directly to the Shopify Admin API.
Order ingestion
A RESTlet receives Shopify order webhooks (orders/create, orders/updated, orders/cancelled, refunds/create) and writes each payload to a staging custom record — customrecord_ecs_shopify_order_queue — with the raw JSON, the Shopify order ID and a processing status. A Scheduled or Map/Reduce script then transforms staged payloads into Sales Order records. Staging matters: webhooks arrive at Shopify's pace, not NetSuite's governance budget, and a failed transformation must be replayable without asking Shopify to resend anything.
The transformation maps Shopify line items to NetSuite items by SKU against an item saved search, resolves shipping and discount lines to the service items you nominate, sets the correct subsidiary, location, department, class and any custom segments, and applies the tax treatment your accountant signs off on during scoping. Multi-currency orders are booked in the transaction currency with the exchange rate policy you choose.
Customer and address handling
Customer matching runs against email, then Shopify customer ID stored in a custom field on the Customer record, so a shopper who checks out as a guest and later creates an account resolves to one entity rather than two. Billing and shipping addresses sync into the address sublist. B2B orders can route to an existing parent-child customer hierarchy instead of creating a new record.
Inventory and pricing back to Shopify
A Map/Reduce script reads available quantity from the locations you designate — a single location, a pooled set, or per-Shopify-location mapping — and pushes inventory_levels updates to Shopify on a schedule you control. Available-to-promise logic (on hand less committed, optionally less a safety buffer per item) is defined during scoping, not hardcoded. Price and price-level changes can push to Shopify variants on the same cadence, and item status changes can archive or unpublish a product.
Fulfilment and returns
When an Item Fulfilment is created in NetSuite, a User Event script queues a Shopify fulfilment with the tracking number, carrier and tracking URL so the shopper gets Shopify's shipping notification. Shopify refunds create Credit Memos or Return Authorisations against the originating Sales Order, with restocking handled per your policy.
Payout reconciliation
This is the piece most integrations skip. A Scheduled script pulls Shopify Payments payout and balance-transaction data and builds the deposit-side records: the gross charges, the processing fees to your fee expense account, refunds and adjustments, so the bank deposit matches to the cent. Orders paid through other gateways are handled by the mapping table you define.
Error handling and observability
Every inbound and outbound call is logged to a custom record with the endpoint, payload, HTTP status and response body. Failed records retry on a bounded schedule and then raise a saved-search-driven email alert to the owner you nominate. A dashboard portlet shows the queue depth and the last successful sync per channel, so a stalled integration is visible before a customer notices.
Who this is for
Merchants running one or more Shopify or Shopify Plus stores on NetSuite, including OneWorld accounts where each store maps to a different subsidiary or a different set of locations. It suits operations that need order-level financial accuracy — accrual revenue in the right period, fees expensed correctly, inventory that reflects committed stock — rather than a display-only feed. If you sell configurable kits, matrix items, or subscription products, say so at scoping; those have real mapping consequences.
How delivery works
1. Scoping call. We walk your Shopify admin and your NetSuite account together: store count, order volume, item types (inventory, matrix, kit/assembly, non-inventory, service), subsidiary and location structure, tax setup, gateways in use, and what your finance team needs to reconcile. You leave with a written scope document listing exactly which records, fields and directions are in play.
2. Fixed quote. From that scope, a fixed price and a delivery window — normally two to four weeks depending on how many of the modules above are in scope. Nothing starts until you approve it.
3. Build. Development happens against your sandbox account or a Shopify development store, using SDF so the project is source-controlled from day one.
4. Install in test, then production. We deploy to your sandbox or release preview account first and run your real order shapes through it — a standard order, a multi-currency order, a partial refund, a split fulfilment, a payout cycle. You sign off on the test results. Only then does the bundle install into production, with the script deployments initially set to a controlled status so you choose when live traffic begins.
5. Support. A defect-fix window follows go-live, plus handover documentation and a working session with the person who will own the integration internally. You have the source; you are never locked out of your own customization.