# Curo365 plugin

Integrates Curo365 (opens new window) legal practice management and accounting system with the Epona provisioning service. The plugin listens on an Azure Service Bus queue and syncs matter, client, and financial information from Curo365 to SharePoint as messages arrive — not on a polling schedule.

DLL: Epona.Curo365.dll

# What it does

  • Matter sync — reads matters from Curo365 and creates or updates corresponding records in SharePoint.
  • Client information — syncs client and contact information.
  • Financial data — syncs billing and financial information associated with matters.
  • Field mapping — maps Curo365 fields to SharePoint properties.

# Deployment

  1. Copy Epona.Curo365.dll to the service's bin directory.
  2. Restart the provisioning service.
  3. Open the Configurator, select the relevant SharepointCfg, and configure the Curo365 section that now appears in the property grid.

# Configuration reference

Configured on the SharepointCfg's Curo365 custom settings section, which appears in the Configurator property grid once the plugin DLL is deployed.

# Applied when

  • The Curo365 custom settings section is present on the SharepointCfg
  • Disabled is false
  • Endpoint, SharedAccessKeyName, and SharedAccessKey are all set

If any of these conditions aren't met, the plugin does not connect to the Curo365 queue and no matters are synced.

# General

# Debug

Type: bool | Required: No | Default: false

Logs the raw JSON body of every incoming Curo365 message, and the outgoing message when a matter's SharePoint URL is sent back to Curo365. Enable temporarily when diagnosing a sync issue; leave off otherwise, since it logs full message contents.

# Disabled

Type: bool | Required: No | Default: false

Turns the Curo365 sync off for this SharepointCfg without removing the rest of the configuration. See Applied when.

# Connection

# SendQueueName

Type: string | Required: No | Default: Curo365 | (C#: ConnectionSendQueueName)

Name of the Service Bus queue the plugin sends matter/client updates to (for example, the SharePoint site URL once a matter site has been created). Provided by Curo365.

# ReceiveQueueName

Type: string | Required: No | Default: Epona | (C#: ConnectionReceiveQueueName)

Name of the Service Bus queue the plugin listens on for incoming matter/client messages from Curo365. Provided by Curo365.

# Endpoint

Type: string | Required: Yes | (C#: ConnectionEndPoint)

Service Bus namespace endpoint, for example curo365-<customer>.servicebus.windows.net. The sb:// scheme is added automatically if omitted. Required — see Applied when.

# SharedAccessKeyName

Type: string | Required: No | Default: RootManageSharedAccessKey | (C#: ConnectionSharedAccessKeyName)

Name of the Service Bus Shared Access Policy used to authenticate. Required — see Applied when.

# SharedAccessKey

Type: string (stored encrypted) | Required: Yes

Shared Access Key for the policy named in SharedAccessKeyName. Provided by Curo365. Stored encrypted at rest. Required — see Applied when.

# Matter

# MapMatterCode

Type: string | Required: No | Default: Number | (C#: MapMatterCode)

<Curo365field> path (see Field mapping) used as the matter's code/number in SharePoint.

# MapMatterName

Type: string | Required: No | Default: Name | (C#: MapMatterName)

<Curo365field> path (see Field mapping) used as the matter's display name in SharePoint.

# MapMatterFields

Type: string (multi-line) | Required: No | (C#: MapMatterFields)

Maps additional Curo365 matter fields to SharePoint columns. See Field mapping for syntax and available fields.

# Client

# DefaultClientCode

Type: string | Required: No | (C#: DefaultClientCode)

Fallback client code used when the incoming matter message has no value at the MapClientCode path (for example, matters not tied to a specific client). Only applies when MapClientCode resolves to an empty valueDefaultClientName is used together with it.

# DefaultClientName

Type: string | Required: No | (C#: DefaultClientName)

Fallback client name, used together with DefaultClientCode under the same condition.

# MapClientCode

Type: string | Required: No | Default: Client.Number | (C#: MapClientCode)

<Curo365field> path (see Field mapping) used as the client's code/number in SharePoint. If this resolves to an empty value, DefaultClientCode/DefaultClientName are used instead.

# MapClientName

Type: string | Required: No | Default: Client.Name | (C#: MapClientName)

<Curo365field> path (see Field mapping) used as the client's display name in SharePoint.

# MapClientFields

Type: string (multi-line) | Required: No | (C#: MapClientFields)

Maps additional Curo365 client fields to SharePoint columns. See Field mapping for syntax and available fields.

# TestMapping

Type: bool | Required: No | Default: false

When true, parsed matters are written to a Test subfolder of the monitor directory instead of provisioning anything, and the message is left on the queue rather than being removed. Use this while setting up field mappings for a new customer: a misspelled field path shows up in the dumped JSON as <Curo365field 'X' not found> instead of silently leaving the column empty (see Field mapping).

# Field mapping

MapMatterCode, MapMatterName, MapMatterFields, MapClientCode, MapClientName, and MapClientFields all take one or more <Curo365field> paths into the JSON message Curo365 sends for the matter. MapMatterFields/MapClientFields use the format <Curo365field>=<SharePoint column> (one mapping per line); the others take a single path.

Example message:

{
  "Id": "f6e33ddd-ab70-f111-ab0c-70a8a5b2241e",
  "Name": "Health Care Regulatory Matters",
  "Number": "10724.001",
  "Type": "Pharmacy",
  "State": "Active",
  "Status": "Active",
  "PracticeArea": "Healthcare",
  "Client": {
    "Number": "10724",
    "Name": "Makarious Health Corp.",
    "Email": "livewellutica@gmail.com"
  },
  "Responsible": {
    "Name": "Bradley W Howard",
    "Email": "bhoward@bf-law.com"
  },
  "Originator": {
    "Name": "Bradley W Howard",
    "Email": "bhoward@bf-law.com"
  }
}

Available top-level fields: Id, Name, Number, Type, Description, State, Status, BillableType, OfficeLocation, PracticeArea.

Available nested fields: Client.Number, Client.Name, Client.Email, Client.Id, Responsible.Name, Responsible.Email, Originator.Name, Originator.Email.

A misspelled <Curo365field> path does not raise an error — it's ignored and the mapped SharePoint column is left untouched — so double-check spelling against the list above. Enable TestMapping to catch this during setup instead: it flags the value as <Curo365field 'X' not found>. A field that legitimately exists but has a null value (e.g. an unset Description) is copied as-is, clearing the mapped SharePoint column — only an unresolvable path is treated as a mapping mistake.

Last Updated: 7/13/2026, 3:05:52 PM