diff --git a/src/provider-guides/connectWise.mdx b/src/provider-guides/connectWise.mdx index 8d0ce36d..a48aac4b 100644 --- a/src/provider-guides/connectWise.mdx +++ b/src/provider-guides/connectWise.mdx @@ -251,21 +251,128 @@ Write payload example for the `contacts` object: } ``` +### Custom Fields + +The connector supports reading and writing custom fields on supported objects, and they behave like native fields. For reads, they're available through scheduled reads, historical backfills, and subscriptions. + +Each custom field is exposed as `customField`. Map it to a more readable name in your configuration with `mapToName`. + +> Example: a field with ID `59` representing a marketing preference is selected as `customField59` and can be mapped to `marketingEmailOn`. + +```yaml +read: + objects: + - objectName: contacts + requiredFields: + - fieldName: customField59 + mapToName: marketingEmailOn + - fieldName: customField83 + mapToName: hobby +``` + +For writes, provide custom fields as if they were native fields; the connector converts them to the ConnectWise format automatically: + +```json +{ + "firstName": "Estella", + "customField59": true, + "customField83": "Traveling" +} +``` + +You only need to include the custom fields you want to set or change. To clear a field, set its value to `null`. + +To find a custom field's ID, check a read response, custom fields are returned with their IDs in the `customFields` array. + + ### Example integration -To define an integration for ConnectWise, create a manifest file that looks like this: - -```YAML -# amp.yaml -specVersion: 1.0.0 -integrations: - - name: connectWise-integration - displayName: My ConnectWise Integration - provider: connectWise - proxy: - enabled: true +For an example manifest file of a ConnectWise integration, visit our [samples repo on Github](https://github.com/amp-labs/samples/blob/main/connectwise/amp.yaml). + +### Contact Communication Items + +ConnectWise stores a contact's email, phone, and fax numbers inside a nested `communicationItems` array, which isn't directly mappable. To make these easy to read and write, the connector exposes the **default** email, phone, and fax of a contact as flat fields you can map like any other contact field. + +| Field | Description | +|----------------------------|------------------------------------------| +| `AMPERSAND-defaultEmail` | The contact's default email address | +| `AMPERSAND-defaultEmailId` | The communication type of that email | +| `AMPERSAND-defaultPhone` | The contact's default phone number | +| `AMPERSAND-defaultPhoneId` | The communication type of that phone | +| `AMPERSAND-defaultFax` | The contact's default fax number | +| `AMPERSAND-defaultFaxId` | The communication type of that fax | + +Only the **default** item of each category is exposed. If a contact has several emails, only the one marked as default appears in `AMPERSAND-defaultEmail`. + +#### Reading + +Map these fields in a read action just like standard contact fields: + +```yaml +read: + objects: + - objectName: contacts + requiredFields: + - fieldName: AMPERSAND-defaultEmail +``` + +A contact whose default email is `john@example.com` reads back as: + +```json +{ + "AMPERSAND-defaultEmail": "john@example.com", + "AMPERSAND-defaultEmailId": "15" +} ``` +The `...Id` field identifies which communication type the default value belongs to. This matters when a contact has more than one item in the same category. + +#### Writing + +Map a value to `AMPERSAND-defaultEmail` (or phone/fax) to set it when creating or updating a contact: + +- Set just the value, and the connector uses the customer's default type for that category. +- Set the matching `...Id` field too if you want to target a specific type (for example, a Work email vs a Home email). The value is applied to that type and marked as the default. + +An update changes only the fields you send. Anything you don't send is left untouched, so setting the email does not affect the phone, fax, or other contact fields. + +For example, to set a contact's email on create: + +```json +{ + "firstName": "John", + "lastName": "Smith", + "AMPERSAND-defaultEmail": "john@example.com" +} +``` + + +The `...Id` fields refer to ConnectWise "communication types" configured in the customer's ConnectWise account. You only need them when a contact has more than one email, phone, or fax and you want to target a specific one. + + +#### Advanced: partial updates with JSON Patch + +If you call the write API directly, you can send a JSON Patch to change a single field, including these virtual fields: + +```json +{ + "type": "update", + "record": { + "id": "58117", + "patch": [ + { "op": "replace", "path": "/AMPERSAND-defaultEmail", "value": "john@example.com" } + ] + } +} +``` + +- `replace` on a value updates the current default item. +- `replace` on an `...Id` field switches which communication type is the default. +- `remove` deletes the current default item for that category. + +The connector translates these into the correct changes on the underlying `communicationItems` array. + + ## Using the connector This connector uses Basic Auth, which means that you do not need to set up a Provider App before getting started. (Provider apps are only required for providers that use OAuth2 Authorization Code grant type.)