Nuxeo DAM with Salsify CXM Integration

Ethan Steiner
Nuxeo Open Kitchen
Published in
3 min readSep 27, 2022

Most integrations with Nuxeo are implemented with similar patterns. I saw a press release about Salsify’s 10 year anniversary and I wanted to blog about how I integrated the Nuxeo platform with Salsify PXM as the pattern was a little different than usual.

Nuxeo makes a great DAM platform that fits for many different industries as it has a flexible object model and configurable taxonomies. Salsify offers completely different capabilities that help brand manufacturers control their digital supply chain.

More basically, brand manufacturers can use Nuxeo to manage all of their digital assets from creation to publication. Salsify takes those published assets and distributes them across the digital shelf.

As Nuxeo is the system of record for creation and publication of digital assets the best pattern for integration with Salsify is using the event system in Nuxeo to push changes to the Salsify API.

Integrating with external API’s is common within the Nuxeo platform. Salsify has a different object model from Nuxeo so the challenge was understanding the authentication pattern as well as differences between these two data sources. Then adding the code to make both authentication and the data translation simple and configurable.

How did we authenticate with Salsify?

From Salsify: “The Salsify API uses authentication tokens to allow access to the API”. Simple enough. We created a service user account to represent the actions of Nuxeo within Salsify and then generated an API token for that user.

For added configurability, on the Nuxeo side, we made the token, the salsify url, and the organization id configurable so a non-production environment can be tested against non-production Salsify environments with different parameters.

How did we transform the data to fit Salsify’s model?

This was not as simple as a Java class to map the metadata values from Nuxeo to the Salsify. The Salsify pattern we used went like this:
(there are certainly other ways to do this but this worked for this particular client)

An asset is published in Nuxeo — triggering a publish event

Nuxeo maps the metadata from the asset — including product relationships and GS1 codes into a JSON object

Nuxeo sends a POST request with the JSON object to Salsify to create the published Digital Asset in Salsify

Nuxeo uses the product relationship metadata in the Nuxeo object model to GET the published asset’s related product(s) from Salsify

Nuxeo reads the response from Salsify and adds the newly created digital asset’s ID to the proper spot within the product data then sends a PUT request to Salsify updating the product to digital asset relationship within Salsify

All of this is done asynchronously in Nuxeo so as to not delay other processes while the API calls are being made.

Bonus: we wanted a way to track the publishing as it followed the POST of the digital asset, GET the product, and PUT to update the product. To achieve this, we added a PublishToSalsify facet on every published document in Nuxeo. This added metadata for status, date, and the salsify system id. It allows users to easily search for all documents with different statuses, dates, and salsify id’s right within Nuxeo.

As you can see, integrations with external systems are relatively simple to implement in Nuxeo. When integrating with any external system I like to think about five things:

  1. The source of truth
  2. The differences between the object models
  3. The authentication
  4. The communication pattern
  5. The needs for tracking and reporting within Nuxeo

Once you know these things, almost any integration can be done with Nuxeo (I’ve yet to see one that can’t be done). Nuxeo DAM to Salsify CXM follows a similar pattern and when it’s done the value to brand producers is clear.

--

--