Connect Stripe to NetSuite
Why teams connect Stripe and NetSuite
Payments land in Stripe. The books live in NetSuite. Reconciling the two is usually a spreadsheet of exported charges, a manual match against open invoices, and a fee adjustment someone calculates at month-end. It is slow, and it is where the bank balance and the GL drift apart.
- Each paid invoice is matched to its open AR invoice in NetSuite and recorded as a customer payment, keyed on IDs carried in Stripe metadata
- Each payout is reconciled to a bank deposit, with gross, fees, and refunds each on the correct account, so the NetSuite bank balance matches the real one
- Anything the mapping cannot resolve, a missing invoice ID or an unexpected balance-transaction type, goes to a person for review rather than a wrong entry
- Every entry is a run you can inspect, so a disputed reconciliation has a record of the Stripe object and the GL posting it produced
Worked example
The reconciliation flow finance turns on first.
Every paid Stripe invoice booked against the right open NetSuite invoice
Started on invoice.paid, with a branch to a person for anything that will not match.
- Trigger: a Webhook trigger with Auto Register With Stripe for
invoice.paid, carrying the invoice, its customer, andamount_paidin cents. - Identify: read
customer.metadata.netsuite_customer_idandinvoice.metadata.netsuite_invoice_id, set when the invoice was created. - Branch: if either ID is missing, a Wait for form step sends the billing team the invoice with the Stripe link for review.
- Fees:
Get balance transactionfor the invoice's charge readsfeeandnet. - Write: NetSuite
Upsert by external idonCustomerPayment, applying it to the named invoice, mapping the fields below. The processing fee posts as a separate expense line to the Merchant Fees account. - Idempotency: the payment's external ID is the Stripe event ID, so a redelivered event updates the same payment instead of posting a second one.
- Payout reconcile: a second flow on Stripe's
payout.paidwebhook reads the payout's balance transactions and creates a NetSuite deposit to the Stripe clearing account, with a line per charge and a negative line for total fees.
Field mapping
The starting map for the invoice.paid to NetSuite Customer Payment step.
| Stripe | NetSuite | Notes |
|---|---|---|
event.id | CustomerPayment.externalId | Idempotency key. A redelivered event updates the same payment. |
customer.metadata.netsuite_customer_id | CustomerPayment.customer | Match key. Missing value sends the run to review. |
invoice.metadata.netsuite_invoice_id | CustomerPayment.apply.doc | The AR invoice the payment is applied to. |
balance_transaction.net / 100 | CustomerPayment.payment | Amounts are integer cents in Stripe. Divide by 100. Zero-decimal currencies do not. |
balance_transaction.fee / 100 | expense line, Merchant Fees account | Posted as a separate line, not netted into the payment amount. |
invoice.currency | CustomerPayment.currency | Uppercased. Fails the run if the currency is not enabled in NetSuite. |
invoice.status_transitions.paid_at | CustomerPayment.tranDate | Unix timestamp in Stripe. Converted to the NetSuite account timezone. |
charge.id | CustomerPayment.memo | Stored for traceability back to the specific charge. |
What syncs, each direction
- Payments on invoices. Paid invoices become customer payments applied to the matching AR invoice, with fees posted separately. (Stripe to NetSuite)
- Payout reconciliation. Each payout becomes a bank deposit to the Stripe clearing account, with gross, fees, and refunds on the correct accounts. (Stripe to NetSuite)
- Refunds and disputes. A refund creates a customer refund or credit memo. A dispute creates a journal entry to the disputes account, reversed on resolution. (Stripe to NetSuite)
- Invoice creation (optional). Where NetSuite is the billing system, a new NetSuite invoice creates the matching Stripe invoice and stores the cross-IDs in metadata. (NetSuite to Stripe)
Governance and audit
The same controls apply to this sync as to every other Neblex workload.
- Run history. Every entry is a run with the Stripe object, the match logic, and the GL posting. A failed run can be replayed from the step that failed, and the upsert stops a second payment.
- Review tasks. Unmatched invoices, unexpected balance-transaction types, and currency mismatches go to a person as a task rather than posting a wrong entry.
- Scoped access. Stripe uses a restricted API key with read on invoices, charges, and balance transactions, plus write on webhook endpoints for the auto-registered webhook. NetSuite uses a role limited to payments, deposits, and journals.
- Environments. Build against Stripe test mode and a NetSuite sandbox, then promote the same flow to live and production.
Frequently asked questions
Is reconciliation immediate or at month-end?
Immediate on invoice.paid: the flow starts when Stripe sends the event, so a payment is booked moments after it clears. Payout reconciliation runs when Stripe settles a payout, typically daily.
How does it match a Stripe payment to a NetSuite invoice?
By NetSuite IDs carried in Stripe metadata, set at invoice creation. If the IDs are missing, the item goes to a person for review instead of being guessed at.
How are processing fees handled?
Posted as a separate expense line to a Merchant Fees account, not netted into the payment. The payout deposit carries a single negative line for total fees in that batch.
What about a redelivered Stripe event?
Every write uses Upsert by external id with the Stripe event ID, so a redelivered event updates the same record instead of creating a second one. That matters because Stripe delivers events at least once.
Does anything get installed in NetSuite?
No. The connector uses NetSuite's REST web services. No SuiteScript or bundle is deployed.
Connectors used
Stripe
Finance, Billing & Payments
- Operations
- 589
- Operations with typed output
- 99.7%
- Change triggers
- 10 (webhook)
- Signs in with
- API token
NetSuite
ERP & Enterprise Systems
- Operations
- 271
- Operations with typed output
- 0%
- Change triggers
- 1 (poll)
- Signs in with
- Connection details
NetSuite does not describe its output fields in advance, so check the field mapping with Test this step when you build the flow.
Bring one real integration
We will build it with you against your own systems, with the run log open.