LoopFour
IntegrationsAccounting

Sage Intacct

Enterprise financial management for mid-market companies

Sage Intacct

Connect to Sage Intacct for enterprise financial management including AR, AP, GL, and project accounting.

Overview

Sage Intacct is a cloud financial management platform. The integration supports:

  • Customers - Customer master records
  • Vendors - Vendor/supplier records
  • Invoices (AR) - Accounts receivable invoices
  • Bills (AP) - Accounts payable bills
  • Payments - AR and AP payments
  • Journal Entries - General ledger entries
  • Accounts - Chart of accounts
  • Projects - Project tracking and accounting

Prerequisites

  • Sage Intacct subscription
  • Web Services subscription enabled
  • API credentials (Sender ID, Password)
  • Session-based authentication configured

Authentication

Sage Intacct uses session-based XML-RPC authentication via Nango.

curl "http://localhost:3000/api/v1/connections/sage-intacct/auth-url" \
  -H "x-api-key: YOUR_API_KEY"

Available Actions

Customer Actions

getCustomer

Get customer by ID.

{
  "action": "sage-intacct.getCustomer",
  "config": {
    "customerId": "{{input.customerId}}",
    "fields": "*"
  }
}

createCustomer

Create a new customer.

{
  "id": "create-customer",
  "type": "action",
  "action": "sage-intacct.createCustomer",
  "config": {
    "customerId": "CUST-{{input.accountNumber}}",
    "name": "{{input.companyName}}",
    "displayContact": {
      "name": "{{input.contactName}}",
      "printAs": "{{input.companyName}}",
      "companyName": "{{input.companyName}}",
      "phone": "{{input.phone}}",
      "email": "{{input.email}}",
      "address": {
        "address1": "{{input.address.street}}",
        "city": "{{input.address.city}}",
        "state": "{{input.address.state}}",
        "zip": "{{input.address.zip}}",
        "country": "{{input.address.country}}"
      }
    },
    "status": "active",
    "paymentTerm": "Net 30",
    "customerType": "{{input.customerType}}",
    "currency": "USD",
    "creditLimit": "{{input.creditLimit}}"
  }
}

Parameters:

FieldTypeRequiredDescription
customerIdstringNoCustomer ID (auto-generated if blank)
namestringYesCustomer name
displayContactobjectNoPrimary contact info
statusstringNoactive or inactive
paymentTermstringNoPayment term name
customerTypestringNoCustomer classification
currencystringNoDefault currency
creditLimitnumberNoCredit limit amount

updateCustomer

Update an existing customer.

{
  "action": "sage-intacct.updateCustomer",
  "config": {
    "customerId": "{{input.customerId}}",
    "name": "{{input.newName}}",
    "creditLimit": "{{input.newCreditLimit}}"
  }
}

listCustomers

List customers with optional filters.

{
  "action": "sage-intacct.listCustomers",
  "config": {
    "filter": "STATUS = 'active'",
    "fields": "CUSTOMERID,NAME,TOTALDUE",
    "pageSize": 100
  }
}

Vendor Actions

getVendor

Get vendor by ID.

{
  "action": "sage-intacct.getVendor",
  "config": {
    "vendorId": "{{input.vendorId}}",
    "fields": "*"
  }
}

createVendor

Create a new vendor.

{
  "id": "create-vendor",
  "type": "action",
  "action": "sage-intacct.createVendor",
  "config": {
    "vendorId": "VEND-{{input.vendorNumber}}",
    "name": "{{input.vendorName}}",
    "displayContact": {
      "name": "{{input.contactName}}",
      "printAs": "{{input.vendorName}}",
      "companyName": "{{input.vendorName}}",
      "phone": "{{input.phone}}",
      "email": "{{input.email}}",
      "address": {
        "address1": "{{input.address.street}}",
        "city": "{{input.address.city}}",
        "state": "{{input.address.state}}",
        "zip": "{{input.address.zip}}",
        "country": "{{input.address.country}}"
      }
    },
    "status": "active",
    "paymentTerm": "Net 30",
    "vendorType": "{{input.vendorType}}",
    "currency": "USD",
    "taxId": "{{input.taxId}}",
    "form1099Type": "MISC",
    "form1099Box": "7"
  }
}

listVendors

List vendors.

{
  "action": "sage-intacct.listVendors",
  "config": {
    "filter": "STATUS = 'active' AND VENDTYPE = 'Supplier'",
    "pageSize": 100
  }
}

Invoice (AR) Actions

getInvoice

Get AR invoice by ID.

{
  "action": "sage-intacct.getInvoice",
  "config": {
    "invoiceId": "{{input.invoiceId}}",
    "fields": "*"
  }
}

createInvoice

Create an AR invoice.

{
  "id": "create-invoice",
  "type": "action",
  "action": "sage-intacct.createInvoice",
  "config": {
    "customerId": "{{input.customerId}}",
    "invoiceDate": "{{input.invoiceDate}}",
    "dueDate": "{{input.dueDate}}",
    "invoiceNumber": "INV-{{input.invoiceNumber}}",
    "poNumber": "{{input.poNumber}}",
    "description": "{{input.description}}",
    "currency": "USD",
    "lineItems": [
      {
        "accountNumber": "4000",
        "amount": "{{input.items[0].amount}}",
        "memo": "{{input.items[0].description}}",
        "locationId": "{{input.locationId}}",
        "departmentId": "{{input.departmentId}}",
        "projectId": "{{input.projectId}}"
      }
    ]
  }
}

Line Item Parameters:

FieldTypeDescription
accountNumberstringGL account number
amountnumberLine amount
memostringLine description
locationIdstringLocation dimension
departmentIdstringDepartment dimension
projectIdstringProject dimension
customerIdstringCustomer dimension
itemIdstringItem ID
quantitynumberQuantity
pricenumberUnit price

postInvoice

Post an invoice.

{
  "action": "sage-intacct.postInvoice",
  "config": {
    "invoiceId": "{{input.invoiceId}}"
  }
}

listInvoices

List AR invoices.

{
  "action": "sage-intacct.listInvoices",
  "config": {
    "filter": "STATE = 'Posted' AND TOTALDUE > 0",
    "fields": "RECORDNO,CUSTOMERID,TOTALENTERED,TOTALDUE,WHENCREATED",
    "pageSize": 100
  }
}

Bill (AP) Actions

getBill

Get AP bill by ID.

{
  "action": "sage-intacct.getBill",
  "config": {
    "billId": "{{input.billId}}",
    "fields": "*"
  }
}

createBill

Create an AP bill.

{
  "id": "create-bill",
  "type": "action",
  "action": "sage-intacct.createBill",
  "config": {
    "vendorId": "{{input.vendorId}}",
    "billDate": "{{input.billDate}}",
    "dueDate": "{{input.dueDate}}",
    "billNumber": "{{input.vendorInvoiceNumber}}",
    "vendorDocNumber": "{{input.vendorDocNumber}}",
    "description": "{{input.description}}",
    "currency": "USD",
    "lineItems": [
      {
        "accountNumber": "6000",
        "amount": "{{input.amount}}",
        "memo": "{{input.description}}",
        "locationId": "{{input.locationId}}",
        "departmentId": "{{input.departmentId}}"
      }
    ]
  }
}

listBills

List AP bills.

{
  "action": "sage-intacct.listBills",
  "config": {
    "filter": "PAYMENTSTATUS = 'open'",
    "pageSize": 100
  }
}

Payment Actions

createArPayment

Record an AR payment.

{
  "id": "record-payment",
  "type": "action",
  "action": "sage-intacct.createArPayment",
  "config": {
    "customerId": "{{input.customerId}}",
    "paymentMethod": "Check",
    "receiptDate": "{{input.paymentDate}}",
    "bankAccountId": "{{input.bankAccountId}}",
    "referenceNumber": "{{input.checkNumber}}",
    "invoices": [
      {
        "invoiceKey": "{{input.invoiceKey}}",
        "amount": "{{input.paymentAmount}}"
      }
    ]
  }
}

createApPayment

Create an AP payment.

{
  "id": "pay-vendor",
  "type": "action",
  "action": "sage-intacct.createApPayment",
  "config": {
    "vendorId": "{{input.vendorId}}",
    "paymentMethod": "ACH",
    "paymentDate": "{{input.paymentDate}}",
    "bankAccountId": "{{input.bankAccountId}}",
    "documentNumber": "{{input.paymentRef}}",
    "description": "Payment for bills",
    "bills": [
      {
        "billKey": "{{input.billKey}}",
        "amount": "{{input.paymentAmount}}"
      }
    ]
  }
}

Journal Entry Actions

createJournalEntry

Create a journal entry.

{
  "id": "create-je",
  "type": "action",
  "action": "sage-intacct.createJournalEntry",
  "config": {
    "journal": "GJ",
    "batchDate": "{{input.entryDate}}",
    "description": "{{input.description}}",
    "reverseDate": "{{input.reversalDate}}",
    "lines": [
      {
        "accountNumber": "1000",
        "type": 1,
        "amount": "{{input.debitAmount}}",
        "description": "Debit entry",
        "locationId": "{{input.locationId}}",
        "departmentId": "{{input.departmentId}}"
      },
      {
        "accountNumber": "2000",
        "type": -1,
        "amount": "{{input.creditAmount}}",
        "description": "Credit entry",
        "locationId": "{{input.locationId}}",
        "departmentId": "{{input.departmentId}}"
      }
    ]
  }
}

Line Type Values:

  • 1 = Debit
  • -1 = Credit

listJournalEntries

List journal entries.

{
  "action": "sage-intacct.listJournalEntries",
  "config": {
    "filter": "JOURNAL = 'GJ' AND BATCH_DATE >= '01/01/2024'",
    "pageSize": 100
  }
}

Account Actions

getAccount

Get GL account.

{
  "action": "sage-intacct.getAccount",
  "config": {
    "accountNo": "{{input.accountNumber}}",
    "fields": "*"
  }
}

listAccounts

List chart of accounts.

{
  "action": "sage-intacct.listAccounts",
  "config": {
    "filter": "ACCOUNTTYPE = 'balancesheet'",
    "pageSize": 500
  }
}

Project Actions

getProject

Get project by ID.

{
  "action": "sage-intacct.getProject",
  "config": {
    "projectId": "{{input.projectId}}",
    "fields": "*"
  }
}

createProject

Create a project.

{
  "id": "create-project",
  "type": "action",
  "action": "sage-intacct.createProject",
  "config": {
    "projectId": "PROJ-{{input.projectNumber}}",
    "name": "{{input.projectName}}",
    "description": "{{input.description}}",
    "category": "{{input.category}}",
    "status": "Active",
    "customerId": "{{input.customerId}}",
    "managerId": "{{input.managerId}}",
    "beginDate": "{{input.startDate}}",
    "endDate": "{{input.endDate}}",
    "currency": "USD",
    "budgetAmount": "{{input.budget}}"
  }
}

listProjects

List projects.

{
  "action": "sage-intacct.listProjects",
  "config": {
    "filter": "PROJECTSTATUS = 'Active'",
    "pageSize": 100
  }
}

Generic Query

query

Execute a generic query on any object.

{
  "action": "sage-intacct.query",
  "config": {
    "object": "GLACCOUNT",
    "fields": "ACCOUNTNO,TITLE,ACCOUNTTYPE,NORMALBALANCE",
    "filter": "STATUS = 'active'",
    "orderBy": "ACCOUNTNO",
    "pageSize": 500
  }
}

Common Objects

ObjectDescription
CUSTOMERCustomers
VENDORVendors
ARINVOICEAR invoices
APBILLAP bills
ARPAYMENTAR payments
APPAYMENTAP payments
GLBATCHJournal entries
GLACCOUNTGL accounts
PROJECTProjects
EMPLOYEEEmployees
ITEMItems
LOCATIONLocations
DEPARTMENTDepartments
CLASSClasses

Webhook Triggers

Sage Intacct can trigger workflows via platform events.

{
  "trigger": {
    "type": "webhook",
    "provider": "sage-intacct",
    "events": ["ARINVOICE.created", "APPAYMENT.created"]
  }
}

Example Workflow

Invoice creation from HubSpot deal:

{
  "name": "Create Sage Invoice from Won Deal",
  "trigger": {
    "type": "webhook",
    "provider": "hubspot",
    "events": ["deal.propertyChange"]
  },
  "steps": [
    {
      "id": "check-stage",
      "type": "condition",
      "config": {
        "conditions": {
          "and": [
            { "left": "{{input[0].propertyName}}", "operator": "eq", "right": "dealstage" },
            { "left": "{{input[0].propertyValue}}", "operator": "eq", "right": "closedwon" }
          ]
        },
        "then": ["get-deal"],
        "else": []
      }
    },
    {
      "id": "get-deal",
      "type": "action",
      "action": "hubspot.getDeal",
      "config": {
        "dealId": "{{input[0].objectId}}",
        "properties": ["dealname", "amount", "closedate"]
      }
    },
    {
      "id": "get-company",
      "type": "action",
      "action": "hubspot.getAssociations",
      "config": {
        "objectType": "deals",
        "objectId": "{{input[0].objectId}}",
        "toObjectType": "companies"
      }
    },
    {
      "id": "find-customer",
      "type": "action",
      "action": "sage-intacct.listCustomers",
      "config": {
        "filter": "NAME = '{{steps.get-company.output.results[0].properties.name}}'"
      }
    },
    {
      "id": "create-invoice",
      "type": "action",
      "action": "sage-intacct.createInvoice",
      "config": {
        "customerId": "{{steps.find-customer.output.data[0].CUSTOMERID}}",
        "invoiceDate": "{{now | date: 'MM/DD/YYYY'}}",
        "dueDate": "{{now | dateAdd: 30, 'day' | date: 'MM/DD/YYYY'}}",
        "description": "{{steps.get-deal.output.properties.dealname}}",
        "lineItems": [
          {
            "accountNumber": "4000",
            "amount": "{{steps.get-deal.output.properties.amount}}",
            "memo": "Professional Services - {{steps.get-deal.output.properties.dealname}}"
          }
        ]
      }
    },
    {
      "id": "notify-finance",
      "type": "action",
      "action": "slack.sendMessage",
      "config": {
        "channel": "#finance",
        "text": "Invoice created in Sage Intacct for {{steps.get-deal.output.properties.dealname}} (${{steps.get-deal.output.properties.amount}})"
      }
    }
  ]
}

Dimensions

Sage Intacct uses dimensions for reporting segmentation:

DimensionDescription
LOCATIONIDLocation/entity
DEPARTMENTIDDepartment
PROJECTIDProject
CUSTOMERIDCustomer
VENDORIDVendor
EMPLOYEEIDEmployee
ITEMIDItem
CLASSIDClass

Rate Limits

LimitValue
API calls/minute300
Concurrent sessions5 per company
Records per request100

Troubleshooting

Common Errors

ErrorCauseSolution
customerId is requiredMissing customer IDProvide customer ID
BL01001973Duplicate recordCheck for existing record
BL01001074Invalid referenceVerify dimension IDs
WS0001Authentication failedCheck credentials
XL03000009Session expiredRefresh session

XML API Notes

Sage Intacct uses an XML-RPC style API. All requests are wrapped in XML format automatically by the connector. Field names use ALL CAPS (e.g., CUSTOMERID, NAME).

Filter Syntax

Filters use SQL-like syntax:

STATUS = 'active'
TOTALDUE > 0
WHENCREATED >= '01/01/2024'
NAME LIKE 'Acme%'