Sage Intacct – Gotchas
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
attachmentsAllOnly 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.
attachmentsUploadOnly 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).
Bank Accounts1 gotcha
bankAccountsAllPagination is not supported when listing all bank accounts without an account_type filter.
Bill Credit Notes1 gotcha
billCreditNotesAddBill 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.
Bill Payments1 gotcha
billPaymentsAddpayment_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
billsAddline_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.
billsAddbill_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.
billsUpdateline_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
creditNotesAddallocations[] 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.
creditNotesUpdatereference 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
expensesAddWhen 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.
expensesDeleteThe 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
invoicesAddline_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.
invoicesUpdateline_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.
Journal Entries3 gotchas
journalEntriesAllSage 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.
journalEntriesAddSage 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.
journalEntriesUpdateSage 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
journalsAllUse 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
locationsAllReturns 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.
Profit And Loss1 gotcha
profitAndLossOneSage 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
quotesAllQuotes 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.
quotesUpdateWhen 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
taxRatesAllSage 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).
Tracking Categories4 gotchas
trackingCategoriesAllThe Parent ID field refers to the parent tracking category code.
trackingCategoriesAddWhen creating a category with parent ID please use the tracking category code.
trackingCategoriesOneThe Parent ID field refers to the parent tracking category code.
trackingCategoriesUpdateWhen updating the Parent ID field please use the tracking category code.