Get a free audit
Get a free audithello@conversionsking.online

/ 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.

  • Order-to-cash focus
  • Idempotent by design
  • Ties to the bank line
  • You own the code
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.

RecordDirectionTriggerLatencyHow we handle it
OrdersShopify → NetSuiteorders/create webhookNear real-timeCreates 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.
CustomersShopify → NetSuiteFirst order, or customers/createNear real-timeB2C 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 & cancellationsShopify → NetSuiteorders/updated + orders/cancelled webhooksNear real-timeEdits update the open sales order until it’s fulfilled. Cancellations close lines rather than delete them, so the audit trail stays intact.
RefundsShopify → NetSuiterefunds/create webhookNear real-timeCreates 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.
ReturnsShopify → NetSuiteReturn approved in ShopifyNear real-timeOptional. Creates a return authorisation so the warehouse receives against it. The item receipt and credit memo follow when the goods arrive.
Shopify Payments payoutsShopify → NetSuitePayout paidDailyBalance 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 settlementsShopify → NetSuiteProvider settlement reportDailyWhen 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 cardsShopify → NetSuiteGift card sold or redeemedNear real-timeSales 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 fieldNetSuite targetRule
Order.idsalesorder / cashsale → externalidIdempotency key. Every write is an upsert on external ID, so retries can’t double-post.
Order.name (#1042)salesorder → otherrefnumShown as the PO # on the transaction, so finance can search by the number customers quote.
Order.presentmentCurrencyCode + totalPriceSetcurrency + exchangerateBooked in the currency the customer paid. Whose exchange rate applies is agreed in the workshop.
Store, market or ship-to countrysubsidiary + locationRouting rules decide which OneWorld subsidiary owns the sale. The customer must be assigned to that subsidiary too.
LineItem.taxLines (title, rate) + Order.taxesIncludedSuiteTax tax details → taxcodeEach rate maps to a destination-country tax code, so OSS and domestic VAT stay separate. VAT-inclusive prices are split, not grossed up.
LineItem.discountAllocationsLine rate or discount itemDiscounts sit on the line they belong to, so margin by SKU stays honest.
ShippingLine.title / codeshipmethod + shippingcostEach Shopify rate maps to a NetSuite shipping item. Shipping VAT follows the goods it ships.
Refund.refundLineItems (restockType, location)creditmemo item lines + locationRestocked lines go back to the right location. Lines refunded without restock are written off instead.
ShopifyPaymentsBalanceTransaction (type, fee, net)deposit → payment, other and cashback linesFees 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.

  • Shopify Admin GraphQL API
  • Shopify webhooks (HMAC-verified)
  • Shopify Payments payouts & balance transactions
  • NetSuite SuiteTalk REST
  • SuiteQL
  • RESTlets
  • SuiteScript 2.1
  • SuiteTax
  • OAuth 2.0 M2M / Token-Based Auth
  • Durable queue + dead-letter

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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
Book a scoping call

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.

Next step

Pick your first move.

Free, no commitment. A senior person replies within one business day.