Connect Stripe to NetSuite
Book Stripe activity into NetSuite the way finance needs it: each paid invoice recorded as a customer payment against the right AR invoice, each payout reconciled to a bank deposit with processing fees on their own line, and anything that will not match sent to a review queue. Every entry is an ordered run you can trace.
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, lands in a review queue rather than a wrong entry
- Every entry is an ordered run log, 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
Triggered on invoice.paid, with a branch to the review queue for anything that will not match.
- Trigger: Stripe
Event receivedforinvoice.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, post the invoice to
#billing-reviewwith the Stripe link and stop. - Fees: read the related balance transaction for
feeandnet. - Write: NetSuite
Create recordonCustomerPayment, 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 write uses the Stripe event ID as the payment's external ID, so a redelivered event does not post a second payment.
- Payout reconcile: a second flow on
payout.paidreads 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 is a no-op. |
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.
- Ordered run log. Every entry is an event log with the Stripe object, the match logic, and the GL posting. Replay a run without re-creating the payment.
- Review queue. Unmatched invoices, unexpected balance-transaction types, and currency mismatches queue for a person rather than posting a wrong entry.
- Scoped access. Stripe uses a restricted API key with read on invoices, charges, and balance transactions. 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 real-time or at month-end?
Real-time on invoice.paid, so a payment is booked minutes 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 review queue 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 is keyed on the Stripe event ID as an external ID, so a redelivered event is a no-op. This is safe by design because Stripe delivers events at least once.
Does anything get installed in NetSuite?
No. The connector uses NetSuite web services. No SuiteScript or bundle is deployed.
Connectors on this page
Stripe
Payments
- Operations
- 589
- Typed outputs
- 99.7%
- Change triggers
- 10 (webhook)
- Authentication
- Bearer
NetSuite
Applications
- Operations
- 271
- Typed outputs
- 0%
- Change triggers
- 1 (poll)
- Authentication
- ConnectionString
NetSuite does not publish typed output schemas yet, so the field mapping on this page is configured in the flow rather than pre-verified.
Bring one real integration
We will build it with you against your own systems, with the run log open.