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:
- A field is added to each NetSuite invoice and/or Sales Order linking to a SuiteSync-hosted payment form
- The customer is sent the payment form link in an email, NetSuite-generated PDF invoice, etc
- The customer pays the NetSuite invoice (or SalesOrder) using the payment form
- The payment is pushed to NetSuite and applied against the corresponding invoice
- The payment is reconciled against the corresponding deposit. Processing fees are calculated and recorded.
- 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:
Here’s an example of how the customer-facing page looks:
Here are some details:
- Bank transfer (ACH) payments are only supported for USD payments. The currencies ACH supports is governed by Stripe, here's more information.
- 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.
- By default, the customer payment information (i.e. card or bank details) is not stored for future use. This means we use a one-time token in Stripe and do not save the card information in a Stripe customer or otherwise attach the payment to a Stripe customer.
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
Using ACH or other Payment Methods
Stripe supports a wide range of payment methods outside of credit or debit cards. The ability to use these payment methods is dependent on your company's country and the currency of the payment. For instance, ACH payments are only available to US companies transacting in USD. Additionally, some payment methods function differently than cards in Stripe & NetSuite.
Right now, the payment page supports collecting credit, debit, and ACH payment information. ACH payment information is collected using Plaid, which allows users to instantly authenticate their bank for an ACH draft without any micro-verification. SuiteSync integrates with Plaid directly, so there's no need for you to signup with Plaid or build any custom integration. Out of the box, customers can use ACH to pay an invoice or order using the payment link.
Collecting payment details for additional payment methods (like SEPA, SOFORT, etc) will be supported in the future, but is not supported right now. Reach out to support to see if there is a beta available for these payment methods. However, if you collect payment details for these methods manually or through another system, they can be used for manual or automated payments in NetSuite.
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:
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=trueto 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.
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.
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:
Set up email notifications:
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 forindicates the payment was manually created in NetSuite.
Online Payment for NetSuite Invoicemean the payment was initiated by a using their payment link.
Automatic Payment for Invoicemeans the payment was created by the system via the automatic payment system.
Triggered Payment forindicates the payment was created because of a payment or customer token being specified on the transaction.
- The customer portal works differently. The Stripe charge description for payments created through the customer portal is the memo provided by the customer. In order to help identify which payments are created through the customer portal, we've added a metadata field
netsuite_payment_from_customer_portalto the charge. If this metadata field exists, the payment was created by the customer portal.
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).
SuiteSync never communicates directly to your customers. In order to send the payment link to customers, you'll need to build a NetSuite workflow or script to send customers a message with the payment link. You can also add the payment link to your invoice PDFs.
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:
- Company name
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=1000Specify the amount to charge the customer in cents.
card=falseThis disables credit card payments for the form.
store=trueThis defaults the checkbox which allows the user to store card information to checked.
billingAddress=trueRequire a billing address to process a payment
email=falseDon'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. Here's a walkthrough video on how to edit the formula field which generates the payment link dynamically for each invoice and order.
There are some additional customization options available, contact us if there is a use case which is not handled here.
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
Bank to use: PNC
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.
Note that for asynchronous payment methods (like ACH), Stripe cannot detect certain type of failures immediately. For instance, if a customer's bank does not have sufficient funds Stripe won't know about this for a couple days. In this case, a error is not shown to the user immediately and instead a success message is shown.
Learn more about how failed asynchronous payment methods works.
The page is blank or displaying an error. What's wrong?
Here are some possible reasons why this could occur:
- Your NetSuite credentials are invalid
- Your currency configuration settings have changed
- The record in NetSuite was deleted
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