Sage Intacct – Gotchas

Service ID: sage-intacct

Increase ROI and transform your organization with the first and only preferred provider of the AICPA for accounting and financial management software for companies of any size.

⚠️

27 gotchas across 15 resources

These are connector-specific behaviors and limitations to be aware of when integrating.

Attachments2 gotchas

allattachmentsAll

Only invoice and bill are supported as a reference_type. Listing attachments for expense, expense-report or quote returns an empty list rather than an error, even when the record has a file attached in Sage.

Use the sage-intacct-rest connector if you need attachments on those record types — it supports all five.

uploadattachmentsUpload

Only invoice and bill are supported as a reference_type. An upload against expense, expense-report or quote still returns 201 with an attachment id, but the file is NOT linked to the record: it is created in Sage under Company > Supporting Documents and left unattached. Listing that record's attachments then returns an empty array, and deleting the returned id answers 200 without removing anything.

Treat a 201 on those three reference types as "file stored, not attached" — no status code on any of the three calls reports the problem. Use the sage-intacct-rest connector if you need attachments on those record types; it supports all five.

The name you send in x-apideck-metadata becomes Sage's supporting-document ID, which Sage limits to 20 characters. A longer name is rejected with 400 (PL03000018 — Attachments ID is too long).

allbankAccountsAll

Pagination is not supported when listing all bank accounts without an account_type filter.

addbillCreditNotesAdd

Bill credit notes are Sage Intacct AP Adjustments. total_amount, balance and remaining_credit are reported as positive magnitudes (Sage stores an AP credit as a negative amount internally). On a multi-entity company a line_items[].location is required on create. supplier.id/line_items[].ledger_account.id must be the Sage vendor id / account number (the values returned as supplier.display_id / ledger_account.code), not the internal record numbers. number is assigned by Sage and read-only; reference maps to the vendor document number. Line-level tax is not written — the same limitation as the AR credit-notes resource, since both are Sage adjustment objects: per-line tax is captured only under an Advanced Tax solution with multi-line tax enabled, and is otherwise discarded silently despite the write returning 201. A posted AP adjustment reads back as status: posted (consistent with how other connectors report a posted bill credit note). Note this differs from the AR credit-notes resource on the same connector, which reports authorised for the equivalent posted Sage state — the underlying Sage state is the same, only the unified value reported per resource differs.

addbillPaymentsAdd

payment_method is required. A bill payment created without one is rejected with the generic downstream error BL34000094, which does not name the missing field. The value must match one of Sage Intacct's system AP payment methods — e.g. Cash, Printed Check, EFT, Charge Card, or Record Transfer. These methods are company-wide (not per-vendor or per-invoice), so a single value can be reused across all bill payments. There is no endpoint that lists payment methods; the values configured on a company can be discovered by reading existing bill payments or payments and inspecting payment_method. Recording an EFT payment does not require ACH/EFT bank setup on the vendor or account. account (the bank/GL account the payment is drawn from) is also required — a bill payment without it is rejected with the generic code BL01001973 ("Enter a valid bank account"). Like BL34000094, BL01001973 is a generic Sage business-logic code that does not name the cause (it is also returned for closed periods, invalid dates, etc.); always read the specific reason in the error detail (description2) rather than the code alone. When routing a payment to a specific entity (x-apideck-company-id / subsidiary.id), the account must be one that is valid in that entity.

Bills3 gotchas

addbillsAdd

line_items[].item must reference the item by its Sage item code (ITEMID), not by the numeric record number. Pass the value Invoice Items returns in code — either as item.code (preferred; it wins when both are sent) or as item.id. The numeric id returned by Invoice Items is rejected by Sage with "Item 'N' specified is not valid" (BL01001973). No automatic translation is applied: Sage item codes may themselves be numeric, so a record number cannot be told apart from a code.

addbillsAdd

bill_number and reference both map to the single DOCNUMBER field, and bill_number wins — when both are sent, reference is silently discarded. On read both are populated from DOCNUMBER and are always identical. Send reference without bill_number if you rely on it as a back-reference. bill_number is additionally written to RECORDID.

notes is unaffected — it maps to DESCRIPTION and round-trips independently.

updatebillsUpdate

line_items[].item must reference the item by its Sage item code (ITEMID), not by the numeric record number. Pass the value Invoice Items returns in code — either as item.code (preferred; it wins when both are sent) or as item.id. The numeric id returned by Invoice Items is rejected by Sage with "Item 'N' specified is not valid" (BL01001973). No automatic translation is applied: Sage item codes may themselves be numeric, so a record number cannot be told apart from a code.

Credit Notes2 gotchas

addcreditNotesAdd

allocations[] is not applied on create — the credit is created as a standalone ARADJUSTMENT. To apply it to invoices, follow up via /vault/proxy with create_arpymt drawing from the new credit's RECORDNO against the target ARINVOICE. allocations is not returned on read.

reference cannot be stored — Sage Intacct's create_aradjustment rejects a docnumber element, and while it accepts an externalid element on create, that value is silently dropped and never returned on read (verified live). The reference field is only returned on reads when DOCNUMBER was set through another channel; it cannot be set on create or update via this API.

updatecreditNotesUpdate

reference cannot be stored — Sage Intacct's update_aradjustment rejects a docnumber element, and the externalid element it accepts is a create-only integration key that is never returned on read (verified live), so it cannot round-trip. The reference field cannot be set on create or update via this API.

Expenses2 gotchas

addexpensesAdd

When creating an expense for Sage Intacct, the account_id must refer to a credit card account, not a ledger account. You can find the correct credit card account ID in Sage Intacct under the Credit Cards section.

deleteexpensesDelete

The delete operation for credit card transactions in Sage Intacct is not a true deletion. Instead, it performs a reversal using the reverse_cctransaction function.

Invoices2 gotchas

addinvoicesAdd

line_items[].item must reference the item by its Sage item code (ITEMID), not by the numeric record number. Pass the value Invoice Items returns in code — either as item.code (preferred; it wins when both are sent) or as item.id. The numeric id returned by Invoice Items is rejected by Sage with "Item 'N' specified is not valid" (BL01001973). No automatic translation is applied: Sage item codes may themselves be numeric, so a record number cannot be told apart from a code.

updateinvoicesUpdate

line_items[].item must reference the item by its Sage item code (ITEMID), not by the numeric record number. Pass the value Invoice Items returns in code — either as item.code (preferred; it wins when both are sent) or as item.id. The numeric id returned by Invoice Items is rejected by Sage with "Item 'N' specified is not valid" (BL01001973). No automatic translation is applied: Sage item codes may themselves be numeric, so a record number cannot be told apart from a code.

alljournalEntriesAll

Sage Intacct returns journal entry headers only for this endpoint — Intacct's GLBATCH query does not include line items. The line_items array is therefore omitted from each entry in this list. To read line-level detail (accounts, amounts, departments, locations, tracking categories), fetch each entry individually with the Get Journal Entry endpoint.

addjournalEntriesAdd

Sage Intacct only supports draft and posted status fields when updating a journal entry. If no status is provided then the default status is "draft". Only Journal Entries with draft status can be updated. Only the first tracking category is used (tracking_categories[0]). On both create and update, the connector sends both CLASSID (from tracking_categories[0].code) and CLASSDIMKEY (from tracking_categories[0].id), so a class may be referenced by its id (as returned by GET /accounting/tracking-categories) or by its code on either verb; supplying just one of the two is sufficient. Each line's location_id falls back to the connection's configured default entity. When the connection operates at the top level (no specific entity), set location_id explicitly on lines whose ledger account requires a location dimension.

updatejournalEntriesUpdate

Sage Intacct only supports draft and posted status fields when updating a journal entry. If no status is provided then the default status is "draft". Only Journal Entries with draft status can be updated.

Journals1 gotcha

alljournalsAll

Use code as journal_symbol when creating a journal entry — it is the same symbol (e.g. "GJ") already used there. Sage Intacct journals carry no category of their own, so type is always general; allow_vat and currency are not exposed and are always absent.

Locations1 gotcha

alllocationsAll

Returns the full set of Intacct LOCATION records — every location, whether or not it is flagged as a legal entity. For only entity-flagged locations (legal sub-companies under the top-level company), use companies or subsidiaries, which query Intacct's LOCATIONENTITY view.

oneprofitAndLossOne

Sage Intacct's Profit and Loss report is structured around account groups. To retrieve accurate data, all income statement accounts must be mapped to one of the following categories: Revenue, Cost of Revenue, Operating Expense, or Other Expenses. Any income statement accounts that are not mapped to one of these categories will appear under the uncategorized_accounts property.

Quotes2 gotchas

allquotesAll

Quotes are Order Entry transactions (SODOCUMENT). The list endpoint returns header fields only — line_items are omitted on list results; use the GET one endpoint to retrieve full line-item detail for a quote. Quotes are scoped by their transaction-definition class rather than by name, so every quote document type on the tenant is returned — including custom or renamed quote definitions. Sage Intacct lets a tenant define multiple quote document types with arbitrary names; all of them are matched.

updatequotesUpdate

When updating line items, each line item must include its line_number. Sage Intacct matches existing lines by line_number, not by id.

Tax Rates1 gotcha

alltaxRatesAll

Sage Intacct supports multi-component taxes through the components array. Each component can have its own rate and tax authority. Use compound taxes for jurisdictions with multiple tax layers (e.g., GST + PST in Canada).

alltrackingCategoriesAll

The Parent ID field refers to the parent tracking category code.

addtrackingCategoriesAdd

When creating a category with parent ID please use the tracking category code.

onetrackingCategoriesOne

The Parent ID field refers to the parent tracking category code.

updatetrackingCategoriesUpdate

When updating the Parent ID field please use the tracking category code.