IntegrationsCRMSAP Commerce Cloud

SAP Commerce Cloud

Datafly Signal delivers identified customer profiles to SAP Commerce Cloud (formerly SAP Hybris Commerce) server-to-server using the Integration API Module’s OData V2 services. When a visitor is identified in your first-party data, Signal upserts a Customer record into your commerce backend — no client-side script required.

SAP Commerce Cloud ingests customer and master data — it is not a real-time marketing-conversion API. This integration keeps your commerce customer base in sync with the people identified in your first-party events. To capture marketing conversions, pair Signal with an advertising or analytics connector.

Prerequisites

Before configuring SAP Commerce Cloud in Signal you need an inbound Integration Object, an OAuth client, and your API host.

Step 1: Create an inbound Integration Object

The Integration API Module exposes an OData service for each Integration Object you define. You need one rooted on the Customer type.

  1. In Backoffice, open the Integration UI Tool > Integration Objects.
  2. Click + to create a new Integration Object. Give it a name, e.g. InboundCustomer.
  3. Set the Integration Type to INBOUND (this is what exposes a writable POST endpoint).
  4. Choose Customer as the root type.
  5. Add the attributes you want Signal to write — at minimum uid (the key), name, and contactEmail. Add firstName / lastName or custom attributes as needed.
  6. Save. SAP Commerce now exposes the service at /odata2webservices/InboundCustomer/Customers.
⚠️

The Integration Object name, its entity set (e.g. Customers), and every attribute name are defined by you. Your Signal field mappings must match those attribute names exactly, so note them down.

Step 2: Create an OAuth client

  1. In Backoffice, go to System > OAuth > OAuth Client Details (or apply an OAuth client via impex).
  2. Create a client with a Client ID and Client Secret.
  3. Enable the client_credentials grant type.
  4. Grant the client the integration credentials scope and ensure its run-as user has create/update permission on the Customer type.

Step 3: Find your API host

Use the API endpoint host of your environment, with no scheme and no trailing slash — for example api.cXXXXXX.dXX.public.model-t.cc.commerce.ondemand.com. This is the host that serves /odata2webservices and /authorizationserver, not your storefront/OCC host.

Configure in Signal

Configuration Fields

FieldRequiredDescription
base_urlYesAPI host (no scheme, no trailing slash). Serves /odata2webservices and /authorizationserver.
integration_objectYesYour inbound Integration Object name, e.g. InboundCustomer.
entity_setYesThe entity set exposed by the object, e.g. Customers.
client_idYesOAuth client ID with the client_credentials grant.
client_secretYesOAuth client secret.

Management UI Setup

  1. Go to Integrations > Add Integration > SAP Commerce Cloud.
  2. Enter your base_url, integration_object, entity_set, client_id, and client_secret.
  3. Review the field mappings and align the target attribute names with your Integration Object.
  4. Click Save.

API Endpoint

Signal authenticates with the OAuth 2.0 client-credentials flow, then POSTs each customer to the Integration Object’s OData service.

Token request:

POST https://{base_url}/authorizationserver/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id={client_id}&client_secret={client_secret}

Ingestion request:

POST https://{base_url}/odata2webservices/{integration_object}/{entity_set}
Authorization: Bearer {access_token}
Content-Type: application/json
Accept: application/json

A POST performs a deep insert/update (upsert) of the entity. A single record is sent as a flat JSON object.

Identity Signals

SAP Commerce Cloud matches and de-duplicates customers on the Customer uid (login), which is conventionally the email address. Signal therefore keys every upsert on the identified user’s email.

Signal traitOData attributeNotes
emailuidPrimary key — lowercased and trimmed. Customer record is created or updated against this value.
emailcontactEmailSame email, lowercased and trimmed, stored as the contact email.
namenameDisplay name.
first_namefirstNameOptional.
last_namelastNameOptional.

SAP Commerce stores customer records in plain text in your own backend — these are not advertising match keys, so no hashing is applied. Because identity is keyed on uid, only events carrying traits.email produce a record; anonymous traffic is dropped.

How to send customer data

Call datafly.identify() when a user registers, logs in, or completes their profile:

datafly.identify("user-123", {
  email: "jane.doe@example.com",
  firstName: "Jane",
  lastName: "Doe",
  name: "Jane Doe"
});

Event Mapping

Customer Sync preset

Only identify-style events upsert a Customer; page views and other anonymous events are dropped.

Signal eventSAP Commerce action
IdentifiedUpsert Customer
Signed UpUpsert Customer
Logged InUpsert Customer

To map order data, create a richer Integration Object (e.g. rooted on the Order type) and add a matching preset.

Example: Customer upsert

Datafly.js call:

datafly.identify("user-123", {
  email: "jane.doe@example.com",
  firstName: "Jane",
  lastName: "Doe",
  name: "Jane Doe"
});

OData payload sent by Signal to POST /odata2webservices/InboundCustomer/Customers:

{
  "uid": "jane.doe@example.com",
  "contactEmail": "jane.doe@example.com",
  "name": "Jane Doe",
  "firstName": "Jane",
  "lastName": "Doe"
}

A successful upsert returns 201 Created (or 200 OK on update) with the created entity in the response body.

Testing Your Integration

Send a test identify

Trigger datafly.identify() on your site (or use Signal’s event debugger) with a test email.

Confirm the OData call succeeded

In Backoffice, open Integration UI Tool > Monitoring (or System > API > Outbound/Inbound requests) and confirm the inbound request was processed without error.

Verify the customer record

In Backoffice, search Customers for the test email. The record should exist with the name and contact email you sent.

Troubleshooting

ProblemSolution
401 / 403 on the token requestCheck client_id / client_secret, that the OAuth client has the client_credentials grant, and that it holds the integration credentials scope.
403 on the OData POSTThe OAuth client’s run-as user lacks create/update permission on the Customer type. Grant it in Backoffice.
404 on the OData POSTWrong integration_object, entity_set, or base_url. The path is /odata2webservices/<IntegrationObject>/<EntitySet>. Confirm the Integration Object is INBOUND.
400 on the OData POSTA mapped attribute is not present on the Integration Object, or a value is the wrong type. Align Signal field mappings with your IO attributes.
Records not appearingEnsure events carry traits.email — anonymous events are dropped because uid is required.
Wrong hostbase_url must be the API/backoffice host that serves /odata2webservices, not the storefront/OCC host.

Rate Limits

SAP Commerce Cloud does not publish a fixed Integration API rate limit; throughput depends on your environment sizing. Signal delivers one record per identified event; for high-volume backfills, throttle the integration to avoid overloading your commerce nodes.