Technical Overview

We are a technical bunch, and have built this integration to be as easy work with for engineers as it is for the finance team.


The integration is a hosted middleware application that sits between your Stripe and NetSuite accounts, syncing data between the two systems. The integration does not require any "bundle" or application to be installed inside your NetSuite instance, and does not require any customizations to your NetSuite or Stripe accounts. Instead, the integration reacts to the various configuration options in Stripe and NetSuite and handles the complexities within the application itself.

In real time, data generated in your Stripe account is used to an equivalent record in NetSuite. Created NetSuite records are linked to the corresponding Stripe record using the Stripe ID, and the NetSuite internal ID is added to the corresponding Stripe record. In addition to the obvious record translation cases (Stripe Customer => NetSuite Customer) the integration also handles many of lesser known Stripe features and API nuances. Here are a couple of examples:

  • Stripe Coupon or Discounts => Discount line item on the invoice
  • Stripe Customer Balance Usage on an Invoice => NetSuite Credit Memo Applied Against the NetSuite Invoice
  • Stripe Dispute Reversal => Fee Reversal and Cash Reversal GL Entries
  • Partial capture refunds, zero decimal currencies, etc

We've run into many undocumented features and bugs of both Stripe and NetSuite and built systems to handle the various configurations of both Stripe and NetSuite. For instance, if you process more than 10,000 transactions a day NetSuite will start to throw undocumented error codes. We've developed systems to workaround these undocumented bugs and system limitations to ensure the integration works smoothly across various account configurations.

The integration is built to scale and is resilient to API, network, etc failures. We've handled accounts with more than 30,000 transactions per day and we've run into just about every esoteric API error in Stripe and NetSuite you can think of.

Our goal is to enable you to work with the beautiful Stripe API leaving the accounting integration to us, forgetting that NetSuite exists. Don't waste time building accounting automation infrastructure: buy, don't build.

Supported workflows

  • Stripe Subscriptions. If you use Stripe’s recurring billing, all subscription detail (customer, plan, discounts, etc) is brought over to NetSuite. NetSuite’s revenue recognition is also supported.
  • eCommerce. If you have a eCommerce platform (Shopify, WooCommerce, etc) integrated with Stripe, and use NetSuite for order fulfillment, SuiteSync will apply Stripe payments to an open Invoice in NetSuite and automate bank reconciliation.
  • Auth-Fulfill-Capture. If you have a eCommerce platform (Shopify, WooCommerce, etc) integrated with Stripe, and use NetSuite for order fulfillment, SuiteSync will apply Stripe payments to an open Invoice in NetSuite and automate bank reconciliation.
  • Standalone Charges. If your system creates standalone charges for services, we can bring over end-to-end data to properly represent this transaction: customer, invoice, payment, refund, dispute, and reconciliation against a bank deposit.
  • Deposit Reconciliation. The deposit reconciliation system can be used with custom NetSuite integrations you’ve already built.
  • Stripe Relay, Stripe Connect, NetSuite > Stripe Integration, etc. We have flows available to handle most of these trickier use cases. Drop us an email with your specific use case, and we'll be able to quickly determine if it's a use-case we support.

Stripe: NetSuite Object Mapping

Here's a quick reference detailing how various Stripe records are represented in NetSuite. If you are wondering what actions trigger the creation of these records, check out this webhook event reference.

Stripe Object NetSuite Record
Customer Customer
Plan Service Sale Item
Subscription None. Subscriptions are represented by a monthly invoice.
Invoice Invoice, and in some cases, a CreditMemo
Invoice Item Service Sale Item or Discount Item
Coupon Discount Item
Charge CustomerPayment
Refund CustomerRefund, and in some cases, a CreditMemo
Dispute CustomerRefund
Transfer Deposit
Order Sales Order
SKU Inventory Item or Non Inventory Item

Customization

The integration can be customized to fit your exact workflow. Here are a couple of examples:

  • You can leverage just the deposit reconciliation portion of the integration. If you have an existing integration in place for charges and refunds, you can pass record references over to the integration and the integration will reconcile payments against the corresponding transfer in Stripe and record processing, refund, and dispute fees.
  • You can override any portion of the integration by providing a pre-existing NetSuite record reference
  • You can control when records are pushed to NetSuite using the netsuite_block_integration and netsuite_allow_integration metadata flags
  • You can pass record-specific data to NetSuite using Stripe metadata
  • There are lots of minor configuration options that can be configured: disabling customer integration, disabling NetSuite customer updates after they are created, creating individual customer records instead of company customer records, various tax configurations, multi-currency support, unique records for multiple Stripe accounts, etc.

If there's a use-case that isn't supported, and it's a generic use-case that would benefit current or future users, we can build that feature into the integration.

Security

HTTPS is used to communicate with NetSuite and Stripe. No unauthenticated data is passed to NetSuite, Stripe, or any other system.

Credit card numbers, or any other sensitive data that would bring you or SuiteSync into scope for PCI compliance, is not passed to Stripe or NetSuite. All credit card data is stored securely on Stripe’s servers. SuiteSync only uses the tokenized version of the credit card (or any other payment) data.

Here is the sensitive information stored on our servers:

  • Stripe API keys
  • NetSuite credentials. We use token based authentication.

This data is encrypted with a unique key corresponding to your account using Amazon KMS.

This ensures that the only way this information is exposed to a third party is if they gain access to all of our systems.

No other sensitive information is stored on our systems. Only Stripe IDs (i.e. ch_123, cus_123, etc) and NetSuite internal IDs persist in SuiteSync's systems. All sensitive financial information is pulled from Stripe or NetSuite when it is needed and does not persist on our systems. The only time financial data is "stored" on our servers is during processing (i.e. when a transaction is pushed from Stripe to NetSuite): it stored in the RAM on our servers and is immediately wiped when the integration "job" is finished.

The one exception here is if you are using our payment form services, invoice and customer data is cached for a short period of time on our servers (less than 30 minutes) and is automatically removed after that period of time. Note that only customer and invoice data that is paid by customers using our payment form is stored—no other customer or invoice data is cached.

SuiteSync runs on the cloud using managed infrastructure. Our infrastructure providers ensure the latest security patches and updates are in place across all systems with which SuiteSync interfaces.

Vulnerabilities in core libraries and components of our application are monitored on a daily basis. We review any security notices daily and take any necessary action.

Code Examples

Check them out, and don't hesitate to reach out if you'd like to see some example code for a use-case we haven't covered before.

Questions?

Shoot us an email (support@suitesync.io) with any technical questions, or hop the #general channel in our open Slack group.

Also, be sure to search our documentation using the search bar at the top of the screen.