diff --git a/docs/payables/configure-customer.md b/docs/payables/configure-customer.md
index 14e48e5d3..38ca0914f 100644
--- a/docs/payables/configure-customer.md
+++ b/docs/payables/configure-customer.md
@@ -131,7 +131,9 @@ This will allow you to synchronize data with that source, fetching or creating s
| FreeAgent | `fbrh` |
| Oracle NetSuite | `akxx` |
| QuickBooks Online | `qhyg` |
+| Sage Intacct | `knfz` |
| Xero | `gbol` |
+| Zoho Books | `rwuv` |
As an example, let's create a QuickBooks Online (QBO) connection. In response, the endpoint returns a `dataConnection` object with a `PendingAuth` status and a `linkUrl`. Direct your customer to the `linkUrl` to initiate our [Link auth flow](/auth-flow/overview) and enable them to authorize this connection.
diff --git a/docs/payables/sync/suppliers.md b/docs/payables/sync/suppliers.md
index d1e89406f..3106076a9 100644
--- a/docs/payables/sync/suppliers.md
+++ b/docs/payables/sync/suppliers.md
@@ -64,7 +64,7 @@ Include all fields in the request, even if their values haven't changed. If you
:::info Software coverage
-This action is currently only supported for FreeAgent, QuickBooks Online, and Xero.
+This action is currently only supported for FreeAgent, Oracle NetSuite, QuickBooks Online, Sage Intacct, Xero, and Zoho Books.
:::
@@ -72,15 +72,32 @@ This action is currently only supported for FreeAgent, QuickBooks Online, and Xe
Each accounting software has some limitations when updating suppliers. We've summarized them below.
-#### Xero
+
-| Limitation | Description |
-| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- |
-| **Supplier name** | It's not possible to clear the supplier name. Sending a `null` or `""` value for `supplierName`, or `null` value for both `supplierName` and `contactName` keeps the existing supplier name. |
-| **Duplicate names** | Supplier names must be unique. Updating a name to match an existing supplier returns a `400` response. |
-| **Archived suppliers** | It's not possible to update archived suppliers via the Xero API. To unarchive, do it manually in Xero. | |
+
+
+| Limitation | Description |
+| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Supplier name** | If `supplierName` is `null` in the request, FreeAgent uses the value in `contactName` instead (the value must contain a space). Codat rejects a request where both fields are `null` with a `400` response, because FreeAgent requires a name. |
+| **Country** | It's not possible to clear the supplier's country. Sending a `null` value or excluding the field from the request sets the value to the company's default country. |
+| **Default currency** | FreeAgent doesn't support currency at supplier level. Any value sent in the request is ignored, and the response returns the company's base currency. |
+
+
-#### QuickBooks Online
+
+
+| Limitation | Description |
+| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Status** | Always include `status` in the request. Omitting it reactivates an archived supplier. |
+| **Contact name** | `contactName` is not supported on update. Any value sent in the request is ignored and the response returns `null`. |
+| **Duplicate names** | Supplier names must be unique. Updating a name to match an existing supplier returns a `400` response. |
+| **Supplier name** | Omitting `supplierName` clears it. Include the existing name if you don't want to change it. |
+| **Default currency** | The currency must be enabled in the NetSuite organization, or the update returns a `400` response. Sending a `null` value leaves the existing currency unchanged. |
+| **Country** | Address `country` must be a 2-character ISO code. |
+
+
+
+
| Limitation | Description |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -88,13 +105,42 @@ Each accounting software has some limitations when updating suppliers. We've sum
| **Default currency** | It's not possible to update the supplier's currency. Sending a `defaultCurrency` in the request that differs from the current value results in a `400` response. Send a `null` value to leave it unchanged. |
| **Archived suppliers** | All changes to archived suppliers are ignored. Include `"status": "Active"` in the update request to reactivate an archived supplier and apply the changes. |
-#### FreeAgent
+
+
+
+
+| Limitation | Description |
+| -------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| **Supplier name** | It's not possible to clear the supplier name. Sending a `null` value or excluding the field keeps the existing name. |
+| **Default currency** | Sending a `null` value keeps the existing currency, but sending `""` clears the supplier's currency on the platform. |
+| **Addresses** | Sage Intacct supports a single address per supplier, and the response returns the first address only. |
+| **Contact name** | `contactName` is split on the last space into a first and last name, each limited to 40 characters. |
+
+
+
+
+
+| Limitation | Description |
+| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Supplier name** | It's not possible to clear the supplier name. Sending a `null` or `""` value for `supplierName`, or `null` value for both `supplierName` and `contactName` keeps the existing supplier name. |
+| **Duplicate names** | Supplier names must be unique. Updating a name to match an existing supplier returns a `400` response. |
+| **Archived suppliers** | It's not possible to update archived suppliers via the Xero API. To unarchive, do it manually in Xero. |
+
+
+
+
+
+| Limitation | Description |
+| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Supplier name** | It's not possible to clear the supplier name. Sending a `null` value or excluding the field keeps the existing name. |
+| **Duplicate names** | Supplier names must be unique, unless the Zoho Books organization allows duplicate vendor names. Updating a name to match an existing supplier returns a `400` response. |
+| **Default currency** | The currency must exist in the Zoho Books organization's currency list, or the update returns a `400` response. Sending a `null` value keeps the existing currency. Changing a supplier's currency also changes the currency of bills created for that supplier, because Zoho Books derives bill currency from the supplier. |
+| **Addresses** | Billing and delivery addresses are replaced together. Sending only a billing address clears the delivery address. |
+| **Archived suppliers** | Archived suppliers can still be updated — the field changes are applied and the supplier remains archived. A rejected update never changes the supplier's status. |
+
+
-| Limitation | Description |
-| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| **Supplier name** | If `supplierName` is `null` in the request, FreeAgent uses the value in `contactName` instead (the value must contain a space). If both fields are `null`, FreeAgent returns a `400` response. |
-| **Country** | It's not possible to clear the supplier's country. Sending a `null` value or excluding the field from the request sets the value to the company's default country. |
-| **Default currency** | FreeAgent doesn't support currency at supplier level. Any value sent in the request is ignored, and the response returns the company's base currency. |
+
:::tip Recap
diff --git a/docs/payables/sync/update-bill.md b/docs/payables/sync/update-bill.md
index 351f2a57d..446e94854 100644
--- a/docs/payables/sync/update-bill.md
+++ b/docs/payables/sync/update-bill.md
@@ -16,7 +16,7 @@ We distinguish between invoices where the company _owes_ money and those where t
:::info Software coverage
-This action is currently only supported for FreeAgent, QuickBooks Online, and Xero.
+This action is currently only supported for FreeAgent, Oracle NetSuite, QuickBooks Online, Sage Intacct, Xero, and Zoho Books.
:::
@@ -101,6 +101,50 @@ PUT /companies/{companyId}/connections/{dataConnectionId}/payables/bills/{billId
+
+
+```json
+{
+ "description": "Consulting",
+ "unitAmount": 500,
+ "quantity": 2,
+ "accountRef": { "id": "" },
+ "taxRateRef": { "id": "" },
+ "trackingRefs": [
+ {
+ "id": "department-",
+ "dataType": "trackingCategories"
+ },
+ {
+ "id": "location-",
+ "dataType": "trackingCategories"
+ },
+ {
+ "id": "",
+ "dataType": "customers",
+ "isBillable": true
+ }
+ ]
+}
+```
+
+
+
+
+
+```json
+{
+ "description": "Consulting",
+ "unitAmount": 500,
+ "quantity": 2,
+ "accountRef": { "id": "" },
+ "taxRateRef": { "id": "" },
+ "taxAmount": 200
+}
+```
+
+
+
```json
@@ -116,19 +160,38 @@ PUT /companies/{companyId}/connections/{dataConnectionId}/payables/bills/{billId
+
+
+```json
+{
+ "description": "Consulting",
+ "unitAmount": 500,
+ "quantity": 2,
+ "accountRef": { "id": "" },
+ "taxRateRef": { "id": "" },
+ "taxAmount": 200,
+ "trackingRefs": [
+ { "id": "-", "dataType": "trackingCategories" },
+ { "id": "", "dataType": "customers", "isBillable": true }
+ ]
+}
+```
+
+
+
### Software requirements
We have summarized the key differences between the integrations that support updates to bills below:
-| Feature | FreeAgent | QBO | Xero |
-| ------------------------ | -------------------- | ------------------- | ------------------- |
-| **Reference max length** | 255 characters | 21 characters | 255 characters |
-| **`TaxRateRef`** | Must be `null` | Required | Required |
-| **Tax handling** | Use `taxAmount` only | Use `taxRateRef.id` | Use `taxRateRef.id` |
-| **`AccountRef` format** | Nominal code | Numeric string | GUID |
-| **Max line items** | 40 | No limit | No limit |
+| Feature | FreeAgent | NetSuite | QBO | Sage Intacct | Xero | Zoho Books |
+| ------------------------ | -------------------- | --------------------------------- | ------------------- | --------------------------------- | ------------------- | ------------------------------------ |
+| **Reference max length** | 255 characters | 45 characters | 21 characters | 100 characters | 255 characters | 50 characters |
+| **`TaxRateRef`** | Must be `null` | Required with `taxAmount` | Required | Required with `taxAmount` | Required | Required with a non-zero `taxAmount` |
+| **Tax handling** | Use `taxAmount` only | Use `taxRateRef.id` + `taxAmount` | Use `taxRateRef.id` | Use `taxRateRef.id` + `taxAmount` | Use `taxRateRef.id` | Use `taxRateRef.id` + `taxAmount` |
+| **`AccountRef` format** | Nominal code | Internal ID | Numeric string | Account record number | GUID | Numeric ID |
+| **Max line items** | 40 | No limit | No limit | No limit | No limit | No limit |
### Validation errors
@@ -165,6 +228,26 @@ You may encounter a validation error when sending a request to update a bill. In
+
+
+| Issue | Error message |
+| ------------------------------- | ----------------------------------------- |
+| Invalid supplier ID | `Supplier Ref` was not found in NetSuite. |
+| Invalid account ID | `Account Ref` was not found in NetSuite. |
+| Invalid tax rate ID | `Tax Rate Ref` was not found in NetSuite. |
+| Changed or unsupported currency | `Currency` is not supported for supplier. |
+
+
+
+
+
+| Issue | Error message |
+| ------------------------- | ----------------------------------------------------------------------- |
+| Bill fully or partly paid | This bill has been paid or partially paid and can no longer be updated. |
+| Invalid supplier ID | The Supplier with Id `` was not found. |
+
+
+
| Issue | Error message |
@@ -184,6 +267,17 @@ You may encounter a validation error when sending a request to update a bill. In
+
+
+| Issue | Error message |
+| -------------------------- | ------------------------------------------------- |
+| Duplicate reference | Reference has already been used for this supplier |
+| Invalid supplier ID | `SupplierRef Id` was not found in ZohoBooks. |
+| Negative bill total | The total amount due cannot be negative. |
+| Due date before issue date | `dueDate` must be after `issueDate`. |
+
+
+
---