Integrate Stripe-powered eCommerce Stores with NetSuite

Streamline your eCommerce NetSuite integration: automate cash application, bank reconciliation, and handle refunding Stripe charges from within NetSuite.


The SuiteSync eCommerce workflow is a great fit for customers who leverage NetSuite for order fulfillment and use an eCommerce application (Shopify, WooCommerce, Spree, BigCommerce, etc) and Stripe for payment processing and order collection. Here's an overview of this workflow:

  1. You push order from your eCommerce application (Shopify, WooCommerce, Spree, etc) and link the NetSuite Sales Order to the Stripe charge.
  2. You create a NetSuite Invoice from the SalesOrder. Normally, this happens when the order is fulfilled in NetSuite.
  3. SuiteSync looks for NetSuite Invoices, and creates a CustomerPayment applied to the Invoice from the Stripe Charge. In addition to a CustomerPayment workflow, CustomerDeposits are also supported.
  4. The customer payment is automatically reconciled against the corresponding bank deposit. Any processing fees are automatically recorded.
  5. If you need to issue a refund, create a CreditMemo is NetSuite for the amount of the refund and SuiteSync will automatically create the refund in Stripe for you.

Here's a short video walkthrough:

The two key benefits of this flow:

  • Your CX team doesn't have to use Stripe to create refunds or manage the order flow.
  • Your technical team won't have to build a custom integration or manage attempting to get several integration systems talking with each other.
  • Your finance team will stop having to worry about cash application, deposit reconciliation, and fee recording. This will be completely automated and happen silently in the background.

Here's a visual overview:

eCommerce Overview

Technical Overview

Your system is responsible for:

  1. Creating the Stripe charge. Normally this is the default flow: a Stripe charge is created at checkout time, before the order as been pushed into NetSuite.
  2. Pushing an order to NetSuite, and adding the Stripe Charge ID to a custom field on the SalesOrder (more on this later). This is done by a NetSuite integration specific to your eCommerce application. There are pre-built integrations available for most eCommerce applications.
  3. Billing the SalesOrder by creating a Invoice. This is normally done after the order is fulfilled.

After the order is billed, SuiteSync will handle the rest of the process:

  1. SuiteSync inspects all open invoices that contain a Stripe Charge ID in the custom transaction field. When a charge is found, a link is created between the Stripe charge and the NetSuite Invoice. When the link is created you'll see a netsuite_invoice_id key in the Stripe charge metadata. This process occurs when the Invoice is updated, so you can create the NetSuite Invoice and then later link it to a Stripe Charge.
  2. After the link is created, a CustomerPayment is created in NetSuite corresponding to the Stripe Charge, and the full amount of the charge is applied to the Invoice.
  3. The CustomerPayment is reconciled against the corresponding bank deposit using the standard transfer reconciliation flow
  4. If you need to create a refund, normally you'll create three NetSuite records: ReturnAuthorization, CreditMemo, and CustomerRefund. When you create the CreditMemo, the Stripe Charge ID on the Invoice is copied to the CreditMemo. SuiteSync looks for CreditMemos with a charge ID in the custom field. If one is found, a refund for the amount of the CreditMemo is created and the Stripe refund ID is added to the CreditMemo.

Customer Deposits

Using customer deposits in place of a customer payment is also supported. If you accept pre-payment for orders that may not ship for several days, a CustomerDeposit workflow is often the best choice. The customer deposit has a couple key features that make it a better fit than a customer payment if you accept pre-payments for orders:

  • When a customer deposit is created, it shows up as a liability on your balance sheet until the order is billed. This more accurately represents an unshipped order from the accounting perspective.
  • NetSuite does not allow customer payments to be "linked" to a sales order. Customer payments can only be applied to invoices. Using a customer deposit allows you to determine if a sales order has been paid before shipment.
  • When an order is billed, NetSuite automatically applies the associated customer deposit to the invoice. There is no way to accomplish this with customer payments without custom scripting.
  • Lastly, NetSuite recommends using customer deposits for an order processing workflow that involved pre-payment on an order. Following NetSuite's best practices ensures you can take advantage of any improvements to this recommended process that NetSuite releases in the future.

Here are the differences from the CustomerPayment workflow outlined above:

  1. When a Stripe Charge ID is added to a SalesOrder, a CustomerDeposit immediately is created and connected to the SalesOrder.
  2. Later on, when the SalesOrder is billed and an Invoice is created, the CustomerDeposits are applied to the

Here are some details to consider:

  • If you are using a auth-capture workflow, you cannot use CustomerDeposits.
  • A CustomerDeposit and CustomerPayment workflow can coexist within the same Stripe & NetSuite account.
  • Refunds look a bit different for CustomerDeposits.

Refunds

Refunds can be initiated from Stripe, or directly from NetSuite. Learn more about the refund process.

Disputes

Disputes are handled automatically. Learn more about how disputes are handled.

Implementation Guide

In order for your eCommerce application to work with SuiteSync, you'll need to add the Stripe charge ID to a field on the sales order and ensure an invoice is created when the sales order is billed.

Here's a step-by-step guide of how to setup your application to work with SuiteSync:

  1. We create a "Stripe Transaction ID" custom transaction body field (NetSuite internal ID of custbody_suitesync_authorization_code) for you during the onboarding process.
  2. When your eCommerce integration (Celigo, FarApp, In8, or a custom application) creates a NetSuite SalesOrder set the custbody_suitesync_authorization_code field to the Stripe charge ID. The Stripe ID starts with either ch_ or py_. Here's what your sales order should look like when this is done.
  3. The form used on the SalesOrder must create a Invoice in NetSuite. CashSales are not supported. Here's how to set this up.
  4. If you have multiple subsidiaries, it's critical that the bank chosen connected to Stripe account is connected to the same subsidiaries as the NetSuite customers that are created.

If you are designing a custom integration between your eCommerce application and NetSuite, here is some example code that might be helpful which demonstrates how to push data to NetSuite and set the Stripe Charge ID.

View Example Implementation

Can CashSales be used instead of Invoices?

It is possible for cash sales to be used instead of invoices, but it is not recommended. A CashSale essentially represents a invoice and a payment in a single record. A cash sale is generated from a sales order, and SuiteSync does not create sales orders. Therefore, when cash sales are used SuiteSync does not control key data points which affect the GL impact of the transaction:

  • Amount
  • Currency
  • Posting account
  • Exchange rate
  • Transaction date

In our experience, when SuiteSync is not recording financial transactions the data recorded is not recorded accurately 100% of the time. For instance, rounding errors, tax/shipping calculation, etc can be slightly off from the amount recorded in Stripe which ends up causing reconciliation errors that need to be manually corrected.

For instance, if NetSuite calculates taxes slightly different from your eCommerce application then the CashSale amount will not match the Stripe payment amount. In order to ensure that the GL impact of the CashSales matches the payment amount that Stripe sends to your bank, we'll send you an error and ask you to correct the CashSale amount.

Additionally a CashSale represents a successful payment. If you are using a two-step authorize-capture payment flow this can cause a successful payment to be recorded when Stripe has not yet confirmed that the capture was successful.

Shopify Implementation Guide

The Shopify Transaction endpoint contains the Stripe Charge ID that SuiteSync requires to automatically link charges with their associated NetSuite invoice. The Shopify transaction receipt.id should have a value which starts with a py_ or ch_. Stripe uses these two prefixes to identify Stripe charges/payments. This reference to a Stripe payment is what SuiteSync requires

Spree, BigCommerce, WooCommerce, Magento, Solidus, etc

Any eCommerce application which supports Stripe as a processor is supported in these systems. You'll be responsible for pulling in customer and order from these systems and tagging the order with the associated Stripe payment ID. SuiteSync will automate the cash application, reconciliation, refunds/disputes, etc in NetSuite.