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.
- In Backoffice, open the Integration UI Tool > Integration Objects.
- Click + to create a new Integration Object. Give it a name, e.g.
InboundCustomer. - Set the Integration Type to INBOUND (this is what exposes a writable POST endpoint).
- Choose Customer as the root type.
- Add the attributes you want Signal to write — at minimum
uid(the key),name, andcontactEmail. AddfirstName/lastNameor custom attributes as needed. - 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
- In Backoffice, go to System > OAuth > OAuth Client Details (or apply an OAuth client via impex).
- Create a client with a Client ID and Client Secret.
- Enable the client_credentials grant type.
- 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
| Field | Required | Description |
|---|---|---|
base_url | Yes | API host (no scheme, no trailing slash). Serves /odata2webservices and /authorizationserver. |
integration_object | Yes | Your inbound Integration Object name, e.g. InboundCustomer. |
entity_set | Yes | The entity set exposed by the object, e.g. Customers. |
client_id | Yes | OAuth client ID with the client_credentials grant. |
client_secret | Yes | OAuth client secret. |
Management UI Setup
- Go to Integrations > Add Integration > SAP Commerce Cloud.
- Enter your
base_url,integration_object,entity_set,client_id, andclient_secret. - Review the field mappings and align the target attribute names with your Integration Object.
- 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/jsonA 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 trait | OData attribute | Notes |
|---|---|---|
email | uid | Primary key — lowercased and trimmed. Customer record is created or updated against this value. |
email | contactEmail | Same email, lowercased and trimmed, stored as the contact email. |
name | name | Display name. |
first_name | firstName | Optional. |
last_name | lastName | Optional. |
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 event | SAP Commerce action |
|---|---|
Identified | Upsert Customer |
Signed Up | Upsert Customer |
Logged In | Upsert 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
| Problem | Solution |
|---|---|
401 / 403 on the token request | Check 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 POST | The OAuth client’s run-as user lacks create/update permission on the Customer type. Grant it in Backoffice. |
404 on the OData POST | Wrong integration_object, entity_set, or base_url. The path is /odata2webservices/<IntegrationObject>/<EntitySet>. Confirm the Integration Object is INBOUND. |
400 on the OData POST | A 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 appearing | Ensure events carry traits.email — anonymous events are dropped because uid is required. |
| Wrong host | base_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.