Our Sync team recently integrated Cronofy article with Creatio, a low-code platform with comprehensive CRM capabilities. This integration not only enriched the Aurinko API with a new connector but also provided us with valuable insights into the Creatio API. Embark on a journey with us as we delve into our technical review and uncover the key takeaways.

Creatio provides multiple integration options, described here. We chose the more standard OData option and this article is referring to the Creatio’s OData API.

What We Learned about Creatio API:

  1. Authentication and Authorization: The Creatio API docs describe fours types of authentication: Anonymous, Basic, Cookie-based (Forms authentication), and OAuth2 (Client Credentials). In practice though we managed to use only the last two. The “Forms authentication” worked for us out of the box and OAuth2 required a special integrated app setup.

    My example file

    This very first step of the integration seemed pretty difficult:

    • Somehow we could not make the Basic Auth work for us and there is not much information about it in the API docs.

    • The docs have an example explaining their Forms authentication, but this Cookie-based method seems odd for server based integrations. It requires refreshing the cookie after a while, so you still need to keep user login and password in your database.

    • Their OAuth2 Auth is for the client_credentials grant only, meaning it gives you an access token outside a user context, basically admin level access under no specific user-id.

    • Creatio community support does not help developers that are not current customers!

  2. API Comprehensiveness: The OData protocol is very solid (even Microsoft’s Graph API uses it) and well documented and Creatio’s OData API by design should cover all aspects of data management in the platform. However, mastering the OData API requires a thorough understanding of Creatio’s data model, which presents an additional challenge.

    Documentation

    Unfortunately, comprehensive documentation of standard CRM objects is either lacking or published in a less-than-obvious location.

    We had to guess CRM object names (i.e. Contact, Account, Case,…) from the Creatio’s portal urls and then discover their structure using a Postman API request, like GET https://instanceUrl/0/odata/Contact or GET https://instanceUrl/0/odata/Contact(803703ef-f490-4c3d-9093-97a9a7170a8f).

    Metadata

    Thanks to the OData protocol, metadata description is available! The full list of Creatio objects can be looked up through the metadata endpoint (return data in XML):

    GET https://instanceUrl/0/odata/$metadata

    and this provider metadata is available in Aurinko now:

    My example file

    CRUD

    Again, thanks to OData, CRUD operations are consistent and reliable across all objects.

    Create will return a full created object data in response.

    POST url/0/odata/Account
    {
        "Name":"TEST 2"
    }
    

    Read

    GET /v1/direct/0/odata/Account/:id
    

    Update will return 204 HTTP status only without body.

    PATCH url/0/odata/Account/:id
    {
        "Name":"Changing"
    }
    

    Delete will return 204 HTTP status only.

    DELETE url/0/odata/Account/:id
    

    Data Organization

    What stood out to us compared to many other CRM platforms we integrated with is the many levels of data referencing. In the example below you see many reference/id fields. You will have to learn to use OData’s $expand query option to request details of those referenced sub-objects.

    {
    		"Id": "00031cdd-be39-45fd-b2a6-5c87655ae3c0",
    		"Name": "Mohawk Industries, Inc.",
    		"OwnerId": "4b3be6e1-05e9-4002-b977-4b0936ea5f33",
    		"CreatedOn": "2023-08-22T16:23:54.273275Z",
    		"CreatedById": "4b3be6e1-05e9-4002-b977-4b0936ea5f33",
    		"ModifiedOn": "2023-08-22T16:23:54.273275Z",
    		"ModifiedById": "4b3be6e1-05e9-4002-b977-4b0936ea5f33",
    		"OwnershipId": "00000000-0000-0000-0000-000000000000",
    		"PrimaryContactId": "00000000-0000-0000-0000-000000000000",
    		"ParentId": "00000000-0000-0000-0000-000000000000",
    		"IndustryId": "00000000-0000-0000-0000-000000000000",
    		"TypeId": "00000000-0000-0000-0000-000000000000",
    		"Phone": "",
    		"AdditionalPhone": "",
    		"Fax": "",
    		"Web": "",
    		"AddressTypeId": "00000000-0000-0000-0000-000000000000",
    		"Address": "",
    		"CityId": "00000000-0000-0000-0000-000000000000",
    		"RegionId": "00000000-0000-0000-0000-000000000000",
    		"Zip": "",
    		"CountryId": "00000000-0000-0000-0000-000000000000",
    		"AccountCategoryId": "00000000-0000-0000-0000-000000000000",
    		"Notes": "",
    		...
    	}
    

    It was especially strange to see AddressTypeId, CityId, RegionId, CountryId for Addresses. This means that when adding or updating addresses of an Account or Contact your code will have to consult the AddressType, City, Region, Country tables that are also interdependent (i.e. City references a Region, and Region references a Country).

    Additional Email, Phone, Address fields

    There seem to be related tables (Contact/AccountCommunication and Contact/AddressAddress) for storing additional contact emails, phones, addresses, but there are some limitations in populating those. This article describes an approach for creating additional customs fields and syncing their values to those related tables with a BPM process.

  3. Search and Query Capabilities: The API provides the standard OData $filter and $search, so this area is pretty solid.

    One thing we have noticed is that the IN operator does not work for Ids, like this ?$filter=Id in ('Id1', 'Id2'), so you will have to resort to using eq and or for the Id field.

  4. Sync/Deltas API: The OData API supports queries to filter by ModifiedOn, which was the solution in our case for loading updates incrementally. We could not find methods to receive deleted records.

  5. Real-time Notifications: We have not found endpoints to set up real-time notifications or webhooks. But you should be able to poll endpoints using $filter on the ModifiedOn field.

Conclusion

Creatio CRM, a distinctive low-code platform, stands out for its exceptional email marketing capabilities and is increasingly recognized as a compelling alternative to HubSpot CRM. Integrating with Creatio CRM offers app developers an enticing opportunity to expand their market reach, enhance their applications, streamline workflows, deliver data-driven insights, and outshine their competitors.

We have extended Aurinko to support Creatio API. Now, developers can map Creatio data through our Virtualized API to build unified integrations. Moreover, our CRM Contact sync logic can be used to sync Creatio contacts to Salesforce, Hubspot, SugarCRM, and other CRMs.