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 customer payment link handles payment processing, cash application, cash reconciliation, and fee calculation.

Here's a short video walkthrough of how this works:

Here's a written description of 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 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.

Collecting Deposits on SalesOrders

If the customer payment link is used on a SalesOrder, a CustomerDeposit associated with the SalesOrder is created as opposed to a CustomerPayment. When the SalesOrder is billed in NetSuite, an Invoice is created, and the deposit is automatically applied to the invoice.

The customer payment link on a SalesOrder will always display the total amount of the SalesOrder. NetSuite does not take into account any deposits or previous payments on the sales order when displaying the sales order total. For example, if a $100.00 deposit has been made on a sales order totaling $500.00, the amount due will still show as $500.00.

If you need to collect a partial deposit for a sales order before it is billed, you can customize the amount displayed on the page. Simply add ?amount=40000 to the end of the customer payment link URL with the amount you’d like to charge the customer specified in cents. For example, if you add ?amount=40000 this would request $400.00 from the customer for the remaining balance.

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 a feature available that stores the customer's card or bank account for future use. A checkbox is added to the payment form allowing the customer to save their payment credentials for future use.

The customer must click on the checkbox to save their card or bank. It is possible to click this option by default.

Here's how the form looks with this option enabled:

Customer Payment Form

Here's how this 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.

You can opt to send email receipts out of NetSuite instead by setting up a customer NetSuite workflow. If you choose to go this route, you'll have the ability the fully customize the look and feel of the email receipt; Stripe has a limited number of configuration options available for their email 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.

Receiving an internal Notification when a Payment is Made

There are a couple of ways for your team to be notified when a payment on an invoice is made:

  • Stripe can send you an email notification when a payment is made in your Stripe account. This is not a good option if you run many types of payments, some of which you don't want to be notified about, through your Stripe account.
  • When a payment is made using SuiteSync's payment forms, a CustomerPayment is created in NetSuite and the payment method is set to "Stripe". You can create a saved search in NetSuite. NetSuite can then email you when a payment is added to that saved search.

Set up a transaction search:

Customer Payment Form

Set up email notifications:

Customer Payment Form

Note that there are some NetSuite bugs which may cause issues with these notifications. Contact support for more help.

A Guide To See Which System Created a Payment

Once a payment is created, you can use Stripe or NetSuite to see which system created the payment. In Stripe, these key terms will show in the description of the charge. In NetSuite, they will show in the memo field of the payment. These terms can also be used in a NetSuite search as shown above.

  • NetSuite Payment for indicates the payment was manually created in NetSuite.
  • Online Payment for NetSuite Invoice mean the payment was initiated by a using their payment link.
  • Automatic Payment for Invoice means the payment was created by the system via the automatic payment system.
  • Triggered Payment for indicates the payment was created because of a payment or customer token being specified on the transaction.

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:

  • amount=1000 Specify the amount to charge the customer in cents.
  • 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 charging a customer's card or bank fails?

If a customer's credit card or bank fails to process, the invoice is not paid off and the user is notified immediately and asked to enter 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