The NetSuite integration pushes authorised PracBill invoices and their customers into NetSuite, exchanges payments in both directions and imports your chart of accounts. Read this whole page before you enable it: the OAuth settings in NetSuite have to be exact.
| Data | Direction | When |
|---|---|---|
| Customers | PracBill to NetSuite | When an invoice for that customer is pushed. Account Number = PracBill customer ID. |
| Invoices | PracBill to NetSuite | Daily at 9:00 PM AEST. Only invoices with status Authorized. |
| Payments | NetSuite to PracBill | Daily at 6:00 AM AEST. Payments applied to invoices that came from PracBill. |
| Payments | PracBill to NetSuite | Daily at 9:00 PM AEST. Needs a clearing account (see below). |
| Chart of accounts | NetSuite to PracBill | Once, when you first connect. Re-sync manually after adding or removing GL codes. |
You need, from NetSuite:
| Credential | Where to find it | Format |
|---|---|---|
| NetSuite Account ID | Your NetSuite URL (https://[ACCOUNT_ID].app.netsuite.com/) or Setup > Company > Company Information, field Account ID |
1234567, or 1234567-sb1 for a sandbox. Copy the full ID including any suffix. |
| OAuth Client ID | The Consumer Key shown after saving the integration record (step 3 below) | 64 characters |
| OAuth Client Secret | The Consumer Secret shown after saving the integration record. Shown once only. | 64 characters |
And a NetSuite user whose role has these permissions (create a dedicated "PracBill Integration" role with exactly these):
| Area | Permission |
|---|---|
| Transactions | Customers: View, Create, Edit |
| Transactions | Invoices: View, Create, Edit |
| Transactions | Customer Payments: View, Create, Edit |
| Transactions | Customer Deposits: View, Create, Edit (for overpayments) |
| Lists | Chart of Accounts: View |
| Lists | Items: View, Create |
| Lists | Departments: View (if using department mapping) |
| Lists | Subsidiaries: View (multi-subsidiary accounts) |
| Lists | Currencies: View |
| Setup | REST Web Services: Full |
| Setup | User Access Tokens: Full (if using token-based auth) |
This produces the Client ID and Client Secret.
https://billing-api.pracbill.com.au/netsuite/callback. On-premise installs use their own PracBill domain instead. It must match exactly, including https://.The consent policy must be Ask First Time, not "Always Ask" or "Never Ask", and User Credentials must be ticked. Either one wrong produces an "Invalid Grant" error when you connect.
The Consumer Secret is shown once. Store it securely before you leave the page.
Set these in NetSuite before connecting if they apply:
| Setting | Why |
|---|---|
| Default Subsidiary | Multi-subsidiary accounts: choose the subsidiary PracBill creates customers and invoices in, give the integration user access to it, then set it in PracBill's NetSuite settings. |
| Default Currency | Must match PracBill's currency. |
| Customer Form | Optional custom form for PracBill-created customers. |
| Invoice Item | A generic "Service" item for catch-all charges. PracBill creates one if you don't. |
Sandbox first. Use the sandbox Account ID (ends in -sb1, -sb2, and so on), a separate integration record in the sandbox, and test the full sync before connecting production. Production uses the Account ID with no suffix and its own integration record. Never share credentials between sandbox and production.
On success PracBill tests the connection, imports your chart of accounts, verifies permissions and creates a generic service item in NetSuite, and shows: "Successfully connected to NetSuite! Data synchronization has been queued and will complete in the background."
Then assign GL codes to every service type and product, or NetSuite may reject invoices.
Customers are pushed as their invoices are pushed. The NetSuite Account Number is the PracBill customer ID; if a NetSuite customer already has that Account Number, PracBill maps to it instead of creating a new one.
Only Authorized invoices sync. When an invoice is pushed, the customer is created if missing, line items are created for every service, usage and product on the invoice, and service type items are created in NetSuite if they don't exist.
PracBill imports customer payments that are applied to invoices which came from PracBill, with amount, date, payment method (stored in the payment notes) and any memo. The payment is linked to the matching PracBill invoice(s), recorded with type "NetSuite", and identified by its NetSuite internal ID so it is never imported twice. A payment applied to several invoices is linked to each.
If a payment option in PracBill is set up with a NetSuite Bank Account, overpayments (customer deposits) against PracBill-created customers are imported too.
To push payments taken through PracBill gateways or entered manually:
PracBill pushes each payment to the clearing account. When the funds reach your bank, reconcile the bank deposit in NetSuite against the clearing account balance. This handles gateway fees deducted before settlement and batch settlements deposited as one lump sum.
Use a clearing account, not a bank account. It keeps payment recording separate from bank reconciliation.
Imported automatically on first connection only. After adding or removing GL codes in NetSuite, re-sync the chart of accounts manually in PracBill.
| Problem | Cause | Fix |
|---|---|---|
| "Invalid Grant" on connect | OAuth settings in the integration record | Consent policy = Ask First Time; User Credentials ticked; Redirect URI matches your PracBill domain exactly; record is Enabled; Consumer Key and Secret copied without spaces. If still failing, create a new integration record, clear browser cache and cookies, retry. |
| Invalid Account ID | Incomplete or mistyped ID | Include the suffix (-sb1), remove extra spaces, check the account is active. |
Authorization URL shows {accountId} |
Server configuration error (.env on the PracBill server) |
Contact PracBill support. |
| Token expired or invalid | OAuth tokens expire periodically; automatic refresh failed | Open the NetSuite settings for the department and click Reconnect. |
| Permission errors | Authorizing user's role lacks a permission | Grant the permissions listed above; NetSuite audit logs show which was denied. |
| Web services not enabled | SuiteCloud features off | Setup > Company > Enable Features > SuiteCloud: enable REST Web Services. |
| "Your connection to NetSuite failed" alert in department settings | The connecting user was removed or deleted in NetSuite | Reconnect. Existing mappings are kept and syncing resumes where it stopped. |
| Integration record disabled | State set to Disabled in NetSuite | Setup > Integration > Manage Integrations, edit the record, State = Enabled, save, then reconnect in PracBill. |
| GL code errors on invoices | Missing GL mapping | Import the chart of accounts, then assign GL codes to all service types and all products. |
The Account Number already exists |
The customer ID was changed on the NetSuite side | PracBill fetches the current contact ID for that Account Number and updates its mapping; future invoices use it. |
Validation Error: The contact ... has been marked inactive |
Contact is inactive in NetSuite; automatic recovery can't proceed | Reactivate the contact in NetSuite. |
An existing contact could not be found using the specified contact details |
Contact deleted in NetSuite | PracBill resets the NetSuite contact on its side and re-syncs the invoice. |
| Payment from NetSuite not appearing | Not applied to an invoice; invoice not from PracBill; timing; permissions | Check the payment's Apply tab links an invoice; the invoice must have a NetSuite ID in PracBill; imports run 6:00 AM AEST, allow 24 hours; the user needs View on Customer Payments and the connection must not be expired. |
If payment import still fails, send PracBill support the NetSuite payment ID, the NetSuite invoice ID it is applied to, and the PracBill invoice IID.
Related: Integrations, Set up your department.