Integration · NetSuite

Invoice OCR for NetSuite that handles every line and every segment.

Core Invoice reads supplier bills and posts them into NetSuite as Vendor Bills — with line items, tax codes, subsidiary, location, department, class, and any custom segments your CFO insists on — via the SuiteCloud REST API.

Why NetSuite Bill Capture isn't enough

NetSuite's built-in Bill Capture (formerly SmartScan) reads header fields reliably but struggles with line items, tax breakdowns, and multi-line freight surcharges. On a 15-line bill from a typical industrial supplier, Bill Capture gives you the vendor and total — your AP user keys the rest by hand.

Core Invoice extracts the entire document:

  • Supplier identity (name, tax ID, address) → matched against your vendor records
  • Bill metadata (number, date, due date, currency)
  • Every line: item, quantity, unit price, line total
  • Taxes per line and per invoice (rate, base, amount)
  • PO reference numbers — for automatic linkage to open POs

How the connection works

  1. Create an Integration record in NetSuite: Setup → Integration → Manage Integrations → New. Check Token-Based Authentication and copy the Consumer Key + Secret.
  2. Create a Token-Based Authentication role with permissions for the Vendor Bill, Vendor, Subsidiary, and Purchase Order records.
  3. Generate an access token + secret under your integration user.
  4. Add the connection in Core Invoice with your NetSuite account ID, subsidiary ID, consumer key/secret, and token key/secret.
  5. Click Test — Core Invoice runs a no-op GET on /record/v1/subsidiary/<id> and confirms the connection.

What lands in NetSuite

Each extracted bill becomes a vendorBill record posted to /record/v1/vendorBill. The bill is in Pending Approval status (or your configured default approval workflow status) — never posted directly to the GL without a human signing off.

  • Subsidiary: set from the connection's subsidiary ID — single connection = single subsidiary.
  • Vendor matching: by tax ID first (the most reliable signal), then by name against vendor.companyName. Unmatched vendors are flagged for human review.
  • Custom segments: every custbody_* and custcol_* field is mappable in the connection settings.
  • Tax codes: extracted tax rate is mapped to a NetSuite tax code via the connection's tax mapping table.
  • Class, Department, Location: pulled from the vendor's default, the linked PO, or hardcoded per connection — whatever fits your accounting policy.

3-way matching with PO + Item Receipt

For PO-referenced bills, Core Invoice reconciles each Vendor Bill line against the open purchaseOrder and the matching itemReceipt if your vendor sends stockable goods.

  • Quantity against the item receipt — default tolerance 0%
  • Rate against the PO line rate — default tolerance 5%
  • Item mismatch is a hard fail (vendor billed for an item not on the PO)

Mismatches flag the bill and either warn (post anyway, note added) or block (hold until corrected) based on your tolerance policy. This complements NetSuite's own 3-way match validation — Core Invoice catches mismatches before the bill hits NetSuite, so your AP team isn't stuck cleaning up posting errors.

Multi-subsidiary (OneWorld) setups

Each NetSuite subsidiary maps to its own Core Invoice ERP connection — with distinct credentials, tax mappings, default G/L accounts, and custom segment mappings. Bills extracted in the EMEA workspace post only to the EMEA subsidiary. Bills extracted in the APAC workspace post only to APAC. There is no cross-subsidiary leakage.

Multi-currency works the way NetSuite expects: extracted currency codes are matched against the subsidiary's allowed currencies, exchange rates are pulled from NetSuite at post time, and the bill records both the foreign currency amount and the subsidiary-base equivalent.

SuiteScript and approval workflows still fire

Bills posted by Core Invoice go through your existing SuiteScript user events (beforeSubmit, afterSubmit) and SuiteFlow approval routings exactly as if a human created them in the UI. Custom validations, default GL overrides, and approval gating all run normally — Core Invoice just provides the data layer.

Security

Consumer and token secrets are encrypted with Fernet server-side and never logged or returned in any API response. We recommend rotating the access token quarterly via NetSuite's Reset Token flow — your Core Invoice connection update takes ~30 seconds.

Try it on your NetSuite sandbox

Point Core Invoice at your NetSuite sandbox account, drop in a real bill, and watch it land as a Vendor Bill in Pending Approval — usually in under 15 seconds.

Start free with NetSuite How the OCR works