Creating Refunds in NetSuite from Stripe

SuiteSync allows refunds issued in Stripe automatically flow to NetSuite. Cash reconciliation for refunds is fully automated.

Refunds issued in Stripe are automatically represented in NetSuite. We've tuned our refund automation to handle a variety of use cases: subscriptions, cash sales, customer deposits, rev rec, ecommerce, etc.

Here's a short video walkthrough:

Depending on the type of payment (deposit or payment) and the state of the payment (applied, unapplied, partially applied, etc) a refund can look slightly different, and there's quite a few options available to control exactly how refunds are represented.

Here's an example of what the CreditMemo and CustomerRefund created by a refunded payment that was applied to an invoice looks like in NetSuite:

Credit Memo for Stripe Refund
Customer Refund for Stripe Refund

Here's a workflow diagram outlining how the refund process works:

SuiteSync Refund Schematic

Refunds for charges applied to an invoice

When a charge applied to an invoice is refunded, the integration creates a CreditMemo and CustomerRefund. This ensures entries are made to income and cash accounts.

If the invoice a payment is applied to changes, SuiteSync detects the new invoice that the payment is applied to uses that invoice to create a credit memo.

This same process applies to customer deposits as well. If the invoice a customer deposit is applied to changes, SuiteSync detects the new customer deposit that the payment is applied to and SuiteSync uses that customer deposit to create a credit memo.

Additionally, if a payment is unapplied from an invoice, then refunded, SuiteSync can detect this and does not create a credit memo. Instead a customer refund is applied directly to the unapplied customer payment

Partial Refunds

Partial refunds are supported. Here are some partial refund details to be aware of:

  • If the invoice contains a single item, a CreditMemo is created using the single line item on the original invoice is set to the refund amount.
  • If the invoice contains multiple items, the integration is unable to determine which line items should be refunded (Stripe does not associate a refund with specific line items). In this case, the refund is represented by a special NonInventorySaleItem named "Stripe Partial Refund Item." If revenue recognition is enabled on your account, this item uses the schedule and deferred revenue account specified in your settings.

As with all Stripe-created records, the internal ID of the NetSuite record is added to the corresponding Stripe record's metadata. In this case netsuite_credit_memo_id and netsuite_customer_refund_id fields are added to the refund's metadata.

Customizing Refund GL Impact

By default, when a CreditMemo or CashRefund is created for a refund the original items on the Invoice or CashSale are included in the CreditMemo.

There's no way to specify a specific "refund" account for an item in NetSuite. When you issue a credit memo with the original items on an invoice, the contra-income entries (i.e. reversal of the revenue) hit the same account as the original items. Often, you don't want the same income account to be used and for this reason there's an option available to delete the original items on the credit memo and use a single line item "Stripe Refund Item" instead.

Here are some reasons why you'd want to use this approach:

  • You want refund to post to a specific GL account
  • You are selling physical products and don't want the refunds's CreditMemo to affect inventory levels

By default, the "Stripe Refund Item" posts to your default income account. To customize the account that the refund item posts to, and consequently the credit memo, you can edit the account of the item in NetSuite. You can also edit the name or any other aspect of the item in NetSuite that you'd like. SuiteSync does overwrite any modifications made to the item in NetSuite.

Refunds for CustomerDeposits

Refunds for charges represented as CustomerDeposits work differently depending on their NetSuite status:

  • If the CustomerDeposit has not been applied to an Invoice, a CustomerRefund is created and applied against the CustomerDeposit.
  • If a CustomerDeposit has been applied to an Invoice, a CreditMemo is created against the Invoice and a CustomerRefund is applied to the CreditMemo

Refunds for Standalone Charges

If a refund is created for a charge that is not associated with an invoice, a CustomerRefund is created and applied against the CustomerPayment. No CreditMemo is created.

Refunds Caused by Failed Asynchronous Payments

Asynchronous payments (like ACH) don't immediately report if they fail or succeed. It sometimes takes a couple days for a payment to fail or succeed, so those payments are applied immediately and considered successful until proven failed.

If a failure does occur, here's what the integration does in the case of asynchronous payments:

  1. Unapply the payment that was previously pending from the invoice
  2. Refund in NetSuite the now unapplied failed payment

The refund in NetSuite will have a message indicating why the payment failed. A memo Stripe Payment Failure: is added with details from Stripe about why the original payment did not come through.

Refunds and the NetSuite Deposit Record

Refunds are included in Stripe transfers, just like charges. Before a refund is included in a transfer, the refund posts to the undeposited funds account in your NetSuite instance (using the CustomerRefund record). After the refund is included in the transfer, the refund is linked to a NetSuite deposit and refund amount moves from undeposited funds to the cash account.

Stripe Fee Refunds

Stripe fee refunds are not represented on the CustomerRefund or CreditMemo records. Stripe fee refunds are recorded on the deposit record as a line item in the "Other Deposits" list. Check out the transfer documentation for more information.

Refunds on Old Transactions

If you are a long-time Stripe user who is just getting started with SuiteSync, we'll set a go-live date on your account. Any transactions (payments, refunds, chargebacks, invoices, payouts, etc) before that go-live date are not imported into NetSuite.

If you need to issue a refund for a transaction created before the go-live date, it'll need to be handled manually. Here's how to refund an old transaction:

  1. Create the refund in Stripe
  2. Manually create the refund in NetSuite (create a credit memo and customer refund)
  3. SuiteSync will automatically "skip" the refund during the reconciliation process. You'll need to manually reconcile this refund to the bank deposit.

If posting these refunds to a single income account (instead of controlling the revenue account used via the CreditMemo) is acceptable, here's an alternative flow:

  1. Create the refund in Stripe
  2. SuiteSync creates an entry on the deposit (i.e. payout) to a income account to represent the refund. This entry is not tied back to the original invoice in any way, and credit memo & customer refund records are not created.

Here's more information on this.