NetSuite B2B Payments with Stripe

Allow customers to pay NetSuite invoices and Sales Orders using a secure payment form. Use this form in emails, NetSuite-generated invoice PDFs, or manual outreach.


This workflow enables customers to pay NetSuite invoices and Sales Orders using a credit card, debit card, bank transfer (ACH), or European payment methods. This workflow is helpful for companies that have open invoices in NetSuite that are collected on using a manual process (check, phone, etc). This workflow can also be used to accept deposits on SalesOrders.

This payment form handles payment processing, cash application, cash reconciliation, and fee calculation.

Here's how it works:

  1. A field is added to each NetSuite invoice and/or Sales Order linking to a SuiteSync-hosted payment form
  2. The customer is sent the payment form link in an email, NetSuite-generated PDF invoice, etc
  3. The customer pays the NetSuite invoice (or SalesOrder) using the payment form
  4. The payment is pushed to NetSuite and applied against the corresponding invoice
  5. The payment is reconciled against the corresponding deposit. Processing fees are calculated and recorded.
  6. Disputes and refunds are handled as well.

Here are some cases where this is helpful:

  • You have a quote-to-order to process in a separate system (like SalesForce) and send the order to NetSuite for collection. You are looking for a way to automate collecting on these invoices.
  • You have a system that creates Invoices directly in NetSuite and you need a way to enable customers to pay these off.
  • You have large invoices (or SalesOrders) where you would like to offer customers the option to pay with a bank transfer instead of a credit card.

Here's a visual overview:

Collections Overview

Here’s an example of how the customer-facing page looks:

Example NetSuite B2B Payment Form

Here are some details:

  • Bank transfer (ACH) payments are only supported for USD payments
  • The payment link is generated immediately when a NetSuite Invoice or Sales Order is created, regardless of how it is created. For example, the payment link is present on invoices created through a CSV import, API integration, or manually through the NetSuite GUI.
  • Customer payment information can be saved for future use in the auto-bill workflow. This is an optional feature.
  • After the invoice is fully paid, the invoice payment link ceases to work. This prevents accidental double payment for invoices.
  • The payment link is generated and available immediately after the invoice is created. You can use rely on the payment link field for any workflows or SuiteScripts immediately after the payment is saved.
  • There are some customizations required to your NetSuite account in order to setup this form, which are detailed out here. If you create new transaction forms, take a look at the documentation to ensure the correct fields are set on the form.
  • Invoices with less due than the Stripe processing minimum display an error page.
  • Payments for Invoices are always captured immediately. There's an optional feature to authorize payments for Sales Orders instead of capturing immediately.

Payments without a SalesOrder or Invoice

In some cases, you'll want to give customers the ability to send a payment without the payment being tied to a specific SalesOrder or Invoice. SuiteSync offers this ability through a customer account link which enables the customer to send a payment with a memo to their NetSuite account. There's also an optional feature available to automatically apply the payment to any open invoices on the customer's account.

Here's an example of what this customer-facing page looks like (the business name, contact information, etc would be changed to match your account):

Customer Payment Form

There are some customization options that you can configure using query strings:

  • amount=10000 Specify the amount the payment form should default to in cents.
  • memo=Custom+memo Specify a default memo to be displayed to the customer.
  • billingAddress=true Require a billing address to process a payment
  • email=false Don't use the NetSuite email address in the Stripe-required email address field

Deposits on SalesOrders

If a payment is processed for a SalesOrder it is created as a CustomerDeposit associated with the SalesOrder. When the SalesOrder is billed in NetSuite, an Invoice is created, and the deposit is automatically applied to the invoice.

There's an option available to authorize a charge (instead of capturing the charge up front) for a SalesOrder. This authorized charge can then later be captured using the auth-capture workflow

Refunds

Refunds can be issued for payments received directly within the NetSuite interface. Learn more about issuing refunds.

Storing Payment Credentials for Future Use

There's an optional feature available that stores collected payment credentials for future use. A checkbox is added to the payment form which allows the customer to elect to save their payment credentials for future use.

Here's how this feature works:

  • If the NetSuite customer is linked to a Stripe customer, payment credentials are added to that pre-existing Stripe customer.
  • If the NetSuite customer is not linked to a Stripe customer, a new Stripe customer is created. The NetSuite customer is linked to this newly created Stripe customer.
  • If no default payment source exists on the Stripe customer, the new payment credentials are set to be the default payment source.
  • If the previous default payment credentials failed to successfully charge during an automatic billing workflow, the new payment credentials are set to be the new default payment method.
  • The default status of the checkbox can be changed by adding ?store=true to the end of the URL.

PCI Compliance and Security Considerations

All credit card, debit card, and bank account information is securely handled and stored via Stripe. SuiteSync’s systems, and your systems, are not in scope for PCI compliance.

The payment form is secured using HTTPS and is only available while the invoice is open (unpaid). By default, we display the email associated with the invoice on the form, but this can be disabled if this is a security concern to your business.

Email Receipts

Stripe offers the ability to automatically send email receipts for payments. SuiteSync leverages this functionality, passing the invoice ID and NetSuite customer email over to Stripe to enable email receipts to be sent.

To enable this feature, you'll need to enable emails for "Successful payments" in your Stripe settings. You can also customize the look and feel of receipts.

Testing Email Receipts
Email receipts are not sent in sandbox (test mode). In order to test receipts in test mode, you'll need to trigger the receipts manually in the Stripe dashboard.

Batch Payments Based on Invoice Due Date

SuiteSync can auto-pay NetSuite invoices based on the invoice due date using stored payment methods in Stripe.

Multiple Customer Currencies

The payment form is fully multi-currency aware. The payment in Stripe is created in the currency of the NetSuite Invoice, and the currency shown to the user changes based on the NetSuite Invoice currency and amount.

In addition, certain payment methods are automatically hidden if they are not available for a specific currency. For instance, ACH is only available for accounts tied to a US entity whose payments are in USD. The ACH bank transfer option is automatically hidden when these two conditions are not present.

Subsidiary-specific Stripe Accounts

If you have separate subsidiaries/entities in NetSuite, you may have a unique Stripe account for each subsidiary in NetSuite.

It's possible to use separate Stripe accounts to process payment depending on the subsidiary associated with the customer, or depending on any other condition you specify (i.e. currency, department, etc).

Customization

You can customize the email and phone displayed at the bottom of the payment form, by editing your public Stripe information. Here are the elements that can be customized using Stripe:

  • Email
  • Phone
  • Company name
  • Website
  • Address

You can also customize some other aspects of the form through query strings, which are essentially options added to the end of the payment link. This enables you to dynamically change the content of the payment form for each customer. For instance, if you want to only allow bank payment for invoices below a certain dollar amount, or disallow card payment for invoices above a certain amount you can do that using these query string customizations.

Here are the options that are available:

  • card=false This disables credit card payments for the form.
  • store=true This defaults the checkbox which allows the user to store card information to checked.
  • billingAddress=true Require a billing address to process a payment
  • email=false Don't use the NetSuite email address in the Stripe-required email address field

Here's some examples of how to implement these options using NetSuite formula fields and templating language.

There are some additional customization options available, contact us if there is a use case which is not handled here.

Testing

Once your payment form is setup, you can test paying NetSuite invoices with either credit cards or ACH payments using the following payment details:

Credit or Debit Card
Card number: 4242 42424 4242 4242
CCV: 123
Expiration 12/2020

ACH Payment
Bank to use: PNC
Username: plaid_test
Password: plaid_good
Security question: tomato

How failures are handled

What if a processing a customers credit card fails?

If a customer's credit card fails to process, the invoice is not paid off and the user is notified immediately and asked to enter in valid payment credentials.

The form is reporting that the invoice is invalid or paid, but it's neither. What is going on?

The form reports that message to the user if there are some other issues with your setup.

Here are some other things to check if the form is failing:

  • Valid NetSuite credentials
  • Valid Stripe credentials
  • For Invoices, the field "Amount Due" (sometimes called Amount Remaining) must be present on the form. Here's how to check this.
  • The total on the invoice is less than 50 cents