Xero – Gotchas

Service ID: xero

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.

allbankFeedAccountsAll

Bank 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).

addbankFeedAccountsAdd

Bank 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).

addbankFeedStatementsAdd

In 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

addbillsAdd

When 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.

updatebillsUpdate

Bills 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

addcreditNotesAdd

For 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)

updatecreditNotesUpdate

- 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)

updatecreditNotesUpdate

Credit 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.

deletecreditNotesDelete

Xero 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

allcustomersAll

In 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

allexpensesAll

In 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.

addexpensesAdd

When 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.

oneexpensesOne

In 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

allinvoicesAll

Invoices 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.

addinvoicesAdd

When 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.

updateinvoicesUpdate

For 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)

updateinvoicesUpdate

Invoices 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.

alljournalEntriesAll

Xero 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.

addjournalEntriesAdd

Xero 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.

updatejournalEntriesUpdate

Xero 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

addpaymentsAdd

Xero 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.

updatepaymentsUpdate

Xero doesn't support updating payments. To update a payment, you need to delete the existing payment and create a new one.

addpurchaseOrdersAdd

Xero accepts a shipping address as a string instead of separate fields. Ie: `23 Main Street Central City Marineville 1234 `

updatepurchaseOrdersUpdate

Xero accepts a shipping address as a string instead of separate fields. Ie: `23 Main Street Central City Marineville 1234 `

updatepurchaseOrdersUpdate

Purchase 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

allsuppliersAll

In 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

alltaxRatesAll

Xero 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.

alltrackingCategoriesAll

Returns 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.