/ 02 Order-to-cash
Shopify → NetSuite. every order booked once.
This is the order-to-cash half of a Shopify NetSuite build. Each Shopify order becomes a NetSuite sales order or cash sale in the right subsidiary, currency and tax code. Refunds post as credit memos and customer refunds. Payouts from Shopify Payments, PayPal and Klarna post as deposits, with fees on their own lines, so the bank reconciliation closes.
- Target order-to-NetSuite latency
- < 60s
- Idempotent order and refund writes
- 100%
- Target payout deposit to bank line
- 1:1
- Orders posted without a tax code
- 0
Design targets we build and monitor against, not averaged client results.
The problem
Every order that posts wrong is a job for month-end.
If finance can’t tie a Shopify payout to a bank line without a spreadsheet, the order-to-cash flow isn’t finished.
- Orders post to the wrong subsidiary or currency, and intercompany clean-up eats the first week of the close.
- EU orders arrive with one tax total, so nobody can say which VAT rate or OSS country they belong to.
- Refunds are keyed as journals, so returns, restocks and revenue never line up.
- Payouts land as one lump sum. Fees, refunds and chargebacks sit in a suspense account.
- Gift cards are booked as revenue when sold, not as a liability until they’re redeemed.
Sync map
What moves, and which way.
Every flow is scoped in the mapping workshop. You switch on the ones you need and leave the rest. Direction is a decision, not a default.
| Record | Direction | Trigger | Latency | How we handle it |
|---|---|---|---|---|
| Orders | Shopify → NetSuite | orders/create webhook | Near real-time | Creates a sales order, or a cash sale for paid orders that skip NetSuite fulfilment. Keyed on the Shopify order ID, so a replayed webhook never duplicates. |
| Customers | Shopify → NetSuite | First order, or customers/create | Near real-time | B2C buyers become individual customers, or post to one generic customer per subsidiary if you prefer. B2B companies become company customers, assigned to the subsidiary that sells to them. |
| Order edits & cancellations | Shopify → NetSuite | orders/updated + orders/cancelled webhooks | Near real-time | Edits update the open sales order until it’s fulfilled. Cancellations close lines rather than delete them, so the audit trail stays intact. |
| Refunds | Shopify → NetSuite | refunds/create webhook | Near real-time | Creates a credit memo against the original invoice or cash sale, then a customer refund for the money returned. Restocked lines name the location to receive into. |
| Returns | Shopify → NetSuite | Return approved in Shopify | Near real-time | Optional. Creates a return authorisation so the warehouse receives against it. The item receipt and credit memo follow when the goods arrive. |
| Shopify Payments payouts | Shopify → NetSuite | Payout paid | Daily | Balance transactions roll up into one deposit per payout. Sales, refunds, chargebacks and adjustments post as lines; processing fees post as cash-back lines. The deposit equals the bank amount. |
| PayPal & Klarna settlements | Shopify → NetSuite | Provider settlement report | Daily | When PayPal or Klarna run outside Shopify Payments, they settle on their own schedule. We build those deposits from the provider’s settlement data, with fees split out, against their own clearing accounts. |
| Gift cards | Shopify → NetSuite | Gift card sold or redeemed | Near real-time | Sales post to a gift card liability account, not revenue. Redemptions clear the liability as a payment on the order. |
Field mapping
The detail that decides it.
A sample of the mapping we agree before building. The real document covers every field on every record, and it's yours whether or not you go ahead with the build.
| Shopify field | NetSuite target | Rule |
|---|---|---|
| Order.id | salesorder / cashsale → externalid | Idempotency key. Every write is an upsert on external ID, so retries can’t double-post. |
| Order.name (#1042) | salesorder → otherrefnum | Shown as the PO # on the transaction, so finance can search by the number customers quote. |
| Order.presentmentCurrencyCode + totalPriceSet | currency + exchangerate | Booked in the currency the customer paid. Whose exchange rate applies is agreed in the workshop. |
| Store, market or ship-to country | subsidiary + location | Routing rules decide which OneWorld subsidiary owns the sale. The customer must be assigned to that subsidiary too. |
| LineItem.taxLines (title, rate) + Order.taxesIncluded | SuiteTax tax details → taxcode | Each rate maps to a destination-country tax code, so OSS and domestic VAT stay separate. VAT-inclusive prices are split, not grossed up. |
| LineItem.discountAllocations | Line rate or discount item | Discounts sit on the line they belong to, so margin by SKU stays honest. |
| ShippingLine.title / code | shipmethod + shippingcost | Each Shopify rate maps to a NetSuite shipping item. Shipping VAT follows the goods it ships. |
| Refund.refundLineItems (restockType, location) | creditmemo item lines + location | Restocked lines go back to the right location. Lines refunded without restock are written off instead. |
| ShopifyPaymentsBalanceTransaction (type, fee, net) | deposit → payment, other and cashback lines | Fees post as cash back to a fees expense account. The deposit total equals ShopifyPaymentsPayout.net. |
What you get
Built to be trusted.
Orders, customers, refunds and payouts posted into NetSuite as clean transactions, with the right subsidiary, currency and VAT code on every line.
Order-to-cash pipeline
HMAC-verified webhooks into a durable queue. Each order’s events process in sequence, so an edit never overtakes the create.
Subsidiary and currency routing
Rules you sign off decide subsidiary, currency, location and customer for every order before it posts.
EU VAT on every line
Destination-country tax codes per line, reverse charge for B2B buyers with a VAT number, and VAT-inclusive prices split correctly.
Payout-to-bank reconciliation
One deposit per payout from Shopify Payments, PayPal and Klarna, with fees and chargebacks on their own lines.
Refunds and returns that tie up
Credit memos, customer refunds and return authorisations linked to the original sale, with restocks to the right location.
Exception queue & runbook
Unknown SKUs, missing tax codes and closed periods land in a queue with a documented fix. Nothing posts on a guess.
The stack
APIs we build on.
No screen scraping, no CSV drops on an FTP server at 3am. First-party APIs, authenticated properly and rate-limit aware.
Edge cases
The 20% that breaks connectors.
We scope these up front instead of discovering them in production. If one applies to you, say so on the call.
- Orders in EUR, GBP, SEK, DKK, PLN or CHF posting to subsidiaries with a different base currency
- OSS distance sales, domestic VAT and B2B reverse charge, decided order by order
- VAT-inclusive prices with order-level discounts spread across mixed VAT rates
- Orders edited after creation: lines added or removed, addresses changed
- Partial refunds, shipping-only refunds and refunds with no restock
- Exchanges handled through Shopify returns rather than a new order
- Chargebacks, chargeback reversals and reserve holds inside a payout
- Gift card plus card payment on the same order
- Orders shipped from another subsidiary’s warehouse, needing intercompany handling
- Closed accounting periods when a late refund or payout arrives
Process
How we ship it.
5–8 weeks typical for the core flows, including a parallel run. Nothing goes live until both systems agree on the same numbers.
- 01
Order-to-cash workshop
We sit with finance and map each order type to a NetSuite transaction: sales order or cash sale, which subsidiary, which tax code, which clearing account. Output is a signed mapping doc before any build.
- 02
Sandbox build
Built against a NetSuite sandbox and a Shopify development store. Idempotency, tax code checks and the exception queue go in first, not as a phase two.
- 03
Parallel run and payout tie-out
Real orders flow while your current process keeps running. We reconcile orders, refunds and at least one full payout cycle to the bank, line by line.
- 04
Cutover & hypercare
Go live with monitoring, alerting and a documented runbook. Two weeks of hypercare with direct Slack access, then handover or a support retainer — your call.
Deliverables
Yours when we leave.
Source code, infrastructure, documentation and training. You can run, extend or replace it without calling us.
- Signed order-to-cash mapping specification
- Production integration service + source code
- Subsidiary, currency and tax code routing rules
- Payout deposit and fee posting logic
- Exception queue with review UI
- Monitoring dashboards & alerts
- Historical backfill & reconciliation report
- Runbook and finance team training
Engagement / Shopify → NetSuite
Fixed-scope build, quoted after the mapping workshop. Typically 5–8 weeks typical for the core flows.
- Mapping workshop first, code second
- Sandbox build, then parallel run
- Reconciled to zero before cutover
- Two weeks of hypercare included
- Source code handed over
Reply within 1 business day. No commitment.
FAQ
The fine print.
Still deciding between building and buying? Book a 30-minute call. We'll tell you which one you are, including when the answer is to keep your connector.
Should Shopify orders post as sales orders or cash sales?+
It depends on who manages fulfilment. If your warehouse or 3PL ships from NetSuite, a sales order gives you the item fulfilment and invoice steps. If Shopify or a 3PL app ships and the order is already paid, a cash sale books revenue and payment in one record. Many brands use both, routed by channel or location. We agree the rule in the workshop.
How do you handle EU VAT, OSS and multiple currencies?+
Each order posts in the currency the customer paid, to the OneWorld subsidiary that owns the sale. Each line carries a destination-country tax code, so OSS distance sales, domestic VAT and B2B reverse charge stay separate, and your VAT reports can run from NetSuite. Shopify’s tax lines are checked against NetSuite’s before posting. A mismatch goes to the exception queue, not the ledger.
How do Shopify Payments, PayPal and Klarna payouts reconcile?+
Each payout becomes one NetSuite deposit that equals the bank amount. For Shopify Payments, we read the payout and its balance transactions through the Admin API, so sales, refunds, chargebacks and fees post as separate lines. PayPal, and Klarna when it runs outside Shopify Payments, settle on their own schedules. We build those deposits from the provider’s settlement data instead.
Should we use Celigo, another iPaaS, or a custom build?+
Pick the one that fits your order-to-cash rules. Celigo’s Shopify–NetSuite integration app covers the standard flows and is maintained for you, on a subscription. Other iPaaS tools, such as Boomi or Workato, give you a general toolkit, but you still build the mappings. A custom build on SuiteScript RESTlets or SuiteTalk REST and the Shopify Admin GraphQL API costs more up front, but you own the code and the edge cases.
What happens to refunds and returns?+
A Shopify refund creates a credit memo against the original sale and a customer refund for the money returned, in the same currency and subsidiary. Restocked lines go back to the location Shopify recorded. If you approve returns in Shopify, we can create a return authorisation first, so the warehouse receives against it before the credit memo posts.
Can you take over an integration that already posts orders?+
Yes. Most order-to-cash work starts with a broken flow: duplicate orders, payouts in suspense, VAT booked to the wrong country. We audit what’s posting, measure the gap, and replace the failing flows one at a time. The rest keep running while we do, so there’s no big-bang cutover.
Other connectors
Pairs well with.
Most clients wire two or three systems at once. The mapping work overlaps, so it costs less than doing them one at a time.
Shopify ↔ NetSuite
Orders, customers, items, inventory, fulfillments and payouts flowing both ways — with NetSuite as the system of record.
NetSuite → Shopify
NetSuite as master: items, stock by location, prices by currency, B2B terms and tracking pushed to Shopify on a cadence you control.
Amazon ↔ NetSuite
Seller Central, FBA and Vendor Central wired into NetSuite — orders, FBA inventory, settlements and chargebacks.
Selling in Europe?
VAT and OSS, OneWorld subsidiaries, EU warehouses and local payouts, market by market.
All services
Store design, Shopify Plus development, CRO, migration, growth and performance.
Next step
Pick your first move.
Free, no commitment. A senior person replies within one business day.