Xero – Gotchas
Get paid sooner when you accept payments online straight from a Xero invoice. Give your customers different payment options, including PayPal and Stripe.
28 gotchas across 13 resources
These are connector-specific behaviors and limitations to be aware of when integrating.
Bank Feed Accounts2 gotchas
bankFeedAccountsAllBank Feed Accounts in Xero represent bank accounts connected to Xero's Bank Feeds feature, which automatically imports bank transactions into Xero on a daily basis. For more information on setting up and using Bank Feeds with Xero, see the [Bank Feeds for Xero guide](https://developers.apideck.com/guides/bank-feeds-xero).
bankFeedAccountsAddBank Feed Accounts in Xero represent bank accounts connected to Xero's Bank Feeds feature, which automatically imports bank transactions into Xero on a daily basis. For more information on setting up and using Bank Feeds with Xero, see the [Bank Feeds for Xero guide](https://developers.apideck.com/guides/bank-feeds-xero).
Bank Feed Statements1 gotcha
bankFeedStatementsAddIn Xero, if a transaction ID has been previously used, the API will reject the entire bank feed statement. However, if the statement includes multiple transactions and at least one transaction ID is unique, the API will return a success response but will not process the transactions with duplicate IDs.
Bills2 gotchas
billsAddWhen providing both supplier.id and supplier.display_name (or supplier.name), Xero will update the contact's name if the ContactID exists. If the ContactID doesn't exist, Xero will automatically create a new contact using the provided name. This allows for automatic contact creation but may update existing contact names if the display_name differs from the stored name.
billsUpdateBills in xero can be tax inclusive, tax exclusive or no tax. The tax_inclusive field should be set to true, false or null if the bill is tax inclusive, tax exclusive or no tax.
Credit Notes4 gotchas
creditNotesAddFor adding invoice allocations, use the proxy API. [Know more](https://developers.apideck.com/connectors/xero/docs/application_owner+oauth_credentials#2-curl-requests-for-adding-and-removing-allocations-from-xero-credit-note)
creditNotesUpdate- Authorised Credit Note can only be updated to voided status and cannot be deleted once authorised. - Any invoice allocation and payment must be deleted before updating the authorised Credit Note to status voided. - To delete payments, use the payment ID from the raw data and delete it using the Delete Payment endpoint. - For adding and removing invoice allocations, use the proxy API. [Know more](https://developers.apideck.com/connectors/xero/docs/application_owner+oauth_credentials#2-curl-requests-for-adding-and-removing-allocations-from-xero-credit-note)
creditNotesUpdateCredit notes in xero can be tax inclusive, tax exclusive or no tax. The tax_inclusive field should be set to true, false or null if the credit note is tax inclusive, tax exclusive or no tax.
creditNotesDeleteXero will only allow deleting a Credit Note if it is in draft status. Credit notes with "authorised" status cannot be deleted directly. Instead: - If the credit note is empty (i.e., has no invoice allocations and payments), its status can be updated to "voided" by update Credit Note endpoint. - If the credit note has invoice allocations and payments, these must be removed first. Once all invoice allocations and payments are deleted, the credit note's status can be updated to "Voided" by update Credit Note endpoint. [Know more](https://developers.apideck.com/connectors/xero/docs/application_owner+oauth_credentials#2-curl-requests-for-adding-and-removing-allocations-from-xero-credit-note)
Customers1 gotcha
customersAllIn Xero, contacts are not strictly separated into customers or suppliers until linked to a transaction. Apideck's approach is to return customers as `IsCustomer=true||IsSupplier=false` and suppliers as `IsSupplier=true||IsCustomer=false`. If you need other cases, use pass-through, e.g. `?pass_through[where]=IsCustomer=false AND IsSupplier=false` for uncategorized contacts. See the [Pass-through guide](https://developers.apideck.com/guides/pass-through) for more details.
Expenses3 gotchas
expensesAllIn Xero, both suppliers (also used for employees) and customers are identified using the same contact ID, which maps to both `supplier_id` and `customer_id`. To accurately determine the contact type, use the suppliers and customers endpoints.
expensesAddWhen creating an expense for Xero, ensure the `account_id` corresponds to a 'bank' or 'credit_card' account type. Using other account types may result in errors or unexpected behavior.
expensesOneIn Xero, both suppliers (also used for employees) and customers are identified using the same contact ID, which maps to both `supplier_id` and `customer_id`. To accurately determine the contact type, use the suppliers and customers endpoints.
Invoices4 gotchas
invoicesAllInvoices in Xero can be tax inclusive, tax exclusive, or no tax. The `tax_inclusive` field is set to `true` (tax inclusive), `false` (tax exclusive), or `null` (no tax). Line items include `tax_rate` references that link to the tax-rates resource.
invoicesAddWhen providing both customer.id and customer.display_name (or customer.name), Xero will update the contact's name if the ContactID exists. If the ContactID doesn't exist, Xero will automatically create a new contact using the provided name. This allows for automatic contact creation but may update existing contact names if the display_name differs from the stored name.
invoicesUpdateFor updating invoices, there are some limitations. Check out [here](https://developers.apideck.com/connectors/xero/docs/application_owner+oauth_credentials#1-limitations-and-rules-for-updating-xero-invoices)
invoicesUpdateInvoices in Xero can be tax inclusive, tax exclusive, or no tax. Set `tax_inclusive` to `true` (amounts include tax), `false` (amounts exclude tax), or `null` (no tax applied). When updating, changing `tax_inclusive` recalculates all line item amounts.
Journal Entries3 gotchas
journalEntriesAllXero has two resources: journals (entries from transactions like invoices, payments, or manual journals) and manual journals (user-created entries). Unify lists journal entries (xero journals) by default. To view draft journal entries (xero manual journals), use the filter `filter[status]=draft`. The exposed id depends on the journal entry status. For draft entries, the id corresponds to a manual journal. For posted entries, the id corresponds to a Journal. Xero returns 100 items per call, so the `limit` parameter is ignored.
journalEntriesAddXero has two separate resources: journals (journal entries generated from any type of originating transaction such as invoices, payments, or manual journals) and manual journals (user-created entries). When a journal entry is created as draft, it is stored as a manual journal and does not yet become a journal. Once it is posted, or if it is created as posted from the beginning, it becomes a journal. In this case, when a draft manual journal is changed to posted, the id will change. Xero only supports `draft` and `posted` for the status field. For ledger accounts in journal lines, you can use either `ledger_account.id` (UUID) or `ledger_account.code`. If only the ID is provided, the code will be resolved automatically. Journal entries in xero can be tax inclusive, tax exclusive or no tax. The `tax_inclusive` field should be set to true, false or null if the journal entry is tax inclusive, tax exclusive or no tax.
journalEntriesUpdateXero has two resources: journals (entries from transactions like invoices, payments, or manual journals) and manual journals (user-created entries). Draft entries are manual journals. When posted, they become journals and the ID changes. Updating a posted entry creates a reverse journal and a new one, so the ID also changes. Xero only supports `draft` and `posted` for the status field. For ledger accounts in journal lines, you can use either `ledger_account.id` (UUID) or `ledger_account.code`. If only the ID is provided, the code will be resolved automatically.
Payments2 gotchas
paymentsAddXero supports creating payments against multiple allocation types in a single request. However, the response will provide the ID of the first payment only. To access all payment IDs, inspect the raw data.
paymentsUpdateXero doesn't support updating payments. To update a payment, you need to delete the existing payment and create a new one.
Purchase Orders3 gotchas
purchaseOrdersAddXero accepts a shipping address as a string instead of separate fields. Ie: `23 Main Street Central City Marineville 1234 `
purchaseOrdersUpdateXero accepts a shipping address as a string instead of separate fields. Ie: `23 Main Street Central City Marineville 1234 `
purchaseOrdersUpdatePurchase orders in xero can be tax inclusive, tax exclusive or no tax. The tax_inclusive field should be set to true, false or null if the purchase order is tax inclusive, tax exclusive or no tax.
Suppliers1 gotcha
suppliersAllIn Xero, contacts are not strictly separated into customers or suppliers until linked to a transaction. Apideck's approach is to return suppliers as `IsSupplier=true||IsCustomer=false` and customers as `IsCustomer=true||IsSupplier=false`. If you need other cases, use pass-through, e.g. `?pass_through[where]=IsCustomer=false AND IsSupplier=false` for uncategorized contacts. See the [Pass-through guide](https://developers.apideck.com/guides/pass-through) for more details.
Tax Rates1 gotcha
taxRatesAllXero tax rates include `effective_tax_rate` for the combined percentage. Tax types are categorized as INPUT (purchases), OUTPUT (sales), or NONE. Use the appropriate tax type when applying rates to invoices vs bills.
Tracking Categories1 gotcha
trackingCategoriesAllReturns tracking category options only. IDs and names are concatenated as "CategoryName - OptionName". The provided ID can be used to link to the correct tracking category to invoices, bills, etc.