Charges

All charges are translates to NetSuite in real-time. All payment types (credit card, ACH, BitCoin, etc) are supported.


There are many different contexts in which a Stripe charge can be created. Each of these contexts is handled a bit differently to ensure that the charge is properly represented in NetSuite.

A charge in NetSuite always represents the payment amount by the customer, not the amount that is deposited to your bank. Since the charge in NetSuite is often applied against a customer's invoice in NetSuite, fees and currency conversion is represented on the deposit record; a charge is always represented in the currency the customer's card was charged and does not include any Stripe fees. This ensures that the payment eliminates the accounts receivable balance created by the NetSuite invoice.

Here's an example of what a charge associated with a invoice looks like in NetSuite:

NetSuite Invoice Partially Paid with Customer Balance

Charge for an Invoice

When Stripe's Subscription Billing is used, invoices will be automatically generated at the end of each period. That invoice is translated to NetSuite and a CustomerPayment is created and applied to the Invoice. If revenue recognition is enabled on your account, the start and end date of the subscription is translated to NetSuite.

If I'm using subscription billing, how could charges be created without an invoice?

Every charge initiated by Stripe's subscription billing system will be associated with an invoice. However, it's possible to create one-off charges associated with a customer. For instance, if a support representative needs to charge the customer a extra one-off fee, they might login to the Stripe dashboard and create a charge associated with that customer. That charge would not have an invoice associated with it, since it was not created by the subscription billing system.

Duplicate payments against an invoice

NetSuite does not allow you to overpay an invoice. If an invoice is fully paid, a second payment against the invoice fails. Stripe does not have this same functionality.

By default, if a duplicate payment occurs in Stripe, the payment gets “stuck” in Stripe, which causes a reconciliation error. This creates a manual process you need to handle on a recurring basis. To fix the issue, manually unapply the first payment from the invoice to allow the second payment through.

SuiteSync offers a workaround for this manual process. If the invoice associated with the payment is fully paid, the payment is brought over as an unapplied payment in NetSuite with a memo Stripe Payment Error: could not apply to invoice XYZ. These unapplied payments can then be applied to another invoice or sales order, or refunded manually in NetSuite. You can view all duplicate payments in your account using the “Stripe Duplicate Invoice Payments” saved search. You can enable this workaround on a case-by-case basis by using the "Allow Duplicate Transaction" button in the resolve page on the SuiteSync dashboard. You can also manually set a netsuite_allow_duplicate field in the metadata of any duplicate Stripe charges, either directly in the Stripe dashboard, or using the API:

Stripe::Charge.create(
  amount: 10_00,
  currency: 'usd',
  customer: 'cus_123',

  metadata: {
    netsuite_allow_duplicate: true
  }
)

Alternatively, you can contact support@suitesync.io to have this behavior enabled by default for all duplicate payments.

I want to pay off an invoice which already exists in NetSuite using Stripe, is that possible?

Yes. If you've created a NetSuite invoice using a custom integration, you can instruct the integration to pay off that invoice in NetSuite by linking a Stripe charge to this invoice. Here's an example of you can implement this.

Charge for a Stripe Order (Relay)

If you are using Stripe's Order API the order integration will create NetSuite CustomerDeposits instead of CustomerPayments and apply them to the SalesOrder.

Charge for a SalesOrder as a CustomerDeposit

Stripe Charges can be attached to SalesOrders as CustomerDeposits. In order to instruct the integration to create a SalesOrder, you can specify the SalesOrder ID in the metadata of the Stripe charge or you can add the Stripe Charge ID to the SalesOrder.

A CustomerDeposit posts to a unique liability account in your NetSuite account, normally called "Customer Deposits". NetSuite does not allow this account to be changed. The CustomerDeposit also posts to the Undeposited Funds, just like a standard Customer Payment (cash is later moved to your checking account when the funds are deposited by Stripe).

When the SalesOrder is billed an Invoice (not a CashSale) is created. NetSuite automatically applies any CustomerDeposits attached to the SalesOrder to the invoice, eliminating the A/R balance on the customer.

Note that NetSuite does not allow a CustomerDeposit to be connected to a SalesOrder if it is closed, cancelled, billed, or pending approval. The configuration of the SalesOrder custom form could also prevent a deposit from being attached to a SalesOrder. Additionally, if the payment method on the sales order is not blank, NetSuite will not allow a customer deposit to be created. If the SalesOrder is in one of these states, it comes over as an unapplied SalesOrder attached to the customer. There's one exception to this rule: if the SalesOrder is in a pending approval state the customer deposit is not created until the SalesOrder is not in that state.

Another nuance to be aware of with CustomerDeposits: once a deposit is attached to a SalesOrder you cannot change the customer or SalesOrder the deposit is connected to.

Charge with a standalone invoice

A charge associated with a standalone invoice (a invoice that was not auto-generated by subscription billing) is translated the same way as a subscription-generated invoice.

However, since standalone invoices are not associated with a subscription billing cycle, the start and end date on a standalone invoice is not set and revenue recognition will not be applied to the invoice.

Standalone customer charge

A charge without an invoice (standalone charge) translates to NetSuite as a Customer Payment applied against the customer associated with the charge. If specified, the description attribute of the charge is added to the Customer Payment's memo.

How standalone invoices affect accounts receivable

A standalone charge will not create a NetSuite transaction record which debits A/R. This will cause credits to A/R caused by CustomerPayment without a corresponding debit. For these standalone charges, you'll need to debit the A/R account manually by creating a journal entry or creating a NetSuite invoice for that customer.

Auto-apply standalone charges to future invoices

A Stripe-created NetSuite Customer Payment can be set to auto-apply to customers' invoices. If this feature is enabled, the Customer Payment is not applied to an invoice directly, but is instead applied to the next available invoice created for that customer.

This enables use of the NetSuite integration for creating the NetSuite Customer Payment and Customer records (as well as automated deposit reconciliation) while using a custom integration to generate the NetSuite Invoice.

ACH, European Bank Transfers, and other Asynchronous Payments

Stripe supports asynchronous payment methods (ex: ACH). These payment methods don't immediately "know" if a payment was successful. In the case of ACH, it can take days for Stripe to be notified if the payment failed. Contact Stripe for more information on exact settlement times for payment methods.

A "pending" Stripe payment (i.e. unconfirmed successful transaction) is brought into NetSuite immediately. If these payments were not pulled in immediately, payment application in NetSuite could be delayed multiple business days which, for most users, causes issues with other automated NetSuite workflows.

In other words, these payments are innocent until proven guilty. In most scenarios, it's rare for payment to fail once it has been initiated, so in the majority of cases, this is the correct approach. If the payment fails, a refund is created in Stripe, and a corresponding customer refund (but not a credit memo) is created in NetSuite. Additionally if the payment was applied to an NetSuite invoice, the payment is unapplied changing the invoice status from "Paid in Full" (or partially paid) to "Open".

If this occurs, the payment failure reason is noted on the CustomerRefund. A saved search can be added to your NetSuite account to identify these transactions so you can build automated or manual workflows around handling these payment failures.

Note that only card payments support auth-capture. All bank payment methods do not support the auth-capture workflow.

Standalone charge without customer

When a Stripe charge that is not associated with a customer is translated to NetSuite it is associated with a special customer, "Stripe Unallocated Charges".

Why are charges created without a customer?

It's possible to charge cards without providing any additional information about a charge. For instance, if you create a create a new payment from your Stripe dashboard (or through the API) without creating a customer first, the charge will not be associated with a customer.