# 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
- Copy
Epona.Curo365.dllto the service's bin directory. - Restart the provisioning service.
- 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 DisabledisfalseEndpoint,SharedAccessKeyName, andSharedAccessKeyare 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 value — DefaultClientName 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.
# Related
- Configuration reference — provisioning configuration reference
- Plugins index — list of available plugins