

Im digitalen Zeitalter sind Echtzeitinformationen für Kunden unverzichtbar – nicht nur in Endkunden-Webshops, sondern zunehmend auch auf Großhandelsplattformen. Insbesondere die Verfügbarkeit von Produkten ist entscheidend. SAP stellt diese Daten in der Public Cloud über OData Services zur Verfügung. In diesem Artikel erfahren Sie, wie Sie diese Daten mithilfe der SAP Integration Suite und des SAP Event Mesh in Ihren Webshop integrieren.
Neben Ihrer Public-Cloud-Instanz benötigen Sie die folgenden Apps in der SAP BTP:
Neben den SAP-Komponenten verwenden wir für dieses Integrationsbeispiel Shopify bzw. dessen REST-API als Webshop. Um mit der Shopify-API zu interagieren, benötigen Sie eine benutzerdefinierte Shopify-App bzw. ein API-Zugriffs-Token.
Die Shopify-App benötigt mindestens die folgenden Berechtigungen:
Alternativ können auch eigene Shops verwendet werden, sofern diese über HTTPS aus der SAP Integration Suite erreichbar sind.
Der Rest des Artikels setzt voraus, dass alle Komponenten zur Verfügung stehen und
Hinweis: Für die Integration von Nicht-Echtzeit-Operationen an der Shopify API gibt es bereits einen Adapter im Business Accelerator Hub, den Sie verwenden können, um z.B. Verkaufsbelege zu synchronisieren.
Jedes Mal, wenn ein Kunde einen Auftrag in Ihrem Webshop platziert, wird dieser Vorgang in Ihrem ERP-System abgebildet. Der genaue Prozess kann individuell variieren, führt jedoch in der Regel zu einem Verkaufsbeleg (Sales Order), in dem alle bestellten Artikel vermerkt sind.
Auf Basis dieses Verkaufsbelegs wird zu einem späteren Zeitpunkt eine „Ausgehende Lieferung“ (Outbound Delivery) erzeugt. Dieser Schritt dient als Indikator dafür, dass die Ware auch wirklich das Lager in Richtung Kunde verlässt.
Welches dieser beiden Ereignisse Sie verwenden, hängt von Ihrer Verkaufsstrategie ab. Sie könnten auch beide Ereignisse abbilden und basierend auf Faktoren wie Produktklassen entscheiden, zu welchem Zeitpunkt die Verfügbarkeit im Webshop aktualisiert wird. Der Einfachheit halber gehen wir im Folgenden davon aus, dass Sie bereits einen Prozess haben, um eines der beiden Dokumente aus dem Webshop heraus zu erzeugen.
Das Integrationsszenario sieht wie folgt aus:
Damit ist die Konfiguration der Eventsteuerung abgeschlossen. Sie können nun probeweise einen Verkaufsbeleg anlegen, um die Propagierung des Events auszulösen. Nutzen Sie dazu die App „Kundenaufträge Anlegen“ oder Ihre bestehende Integration. Sobald der Beleg angelegt wird, erhalten Sie im Event Mesh eine Nachricht:
Für die Entwicklung des Flows können Sie ebenfalls unter „Test“ die Daten, die Sie aus dem SAP erhalten, auslesen und mit einem HTTP-Client das Event simulieren. Dies spart etwas Zeit, da Sie nicht jedes Mal einen neuen Beleg erzeugen müssen.
Wählen Sie dazu einfach die Queue & den Client aus. Klicken Sie anschließend auf „Consume Message“.
Den Wert aus „Message Data“ können Sie im Zusammenspiel mit einem HTTP-Client wie Bruno oder Postman an den Endpunkt der CPI senden, um dessen Funktionalität zu testen.
Bevor Sie mit der Entwicklung beginnen, müssen Sie noch vier wichtige Konfigurationen vornehmen:
Die beiden Kommunikationsvereinbarungen, die Sie benötigen sind SAP_COM_0109 für die Integration von Kundenaufträgen und SAP_COM_0115 für die Integration von Produktverfügbarkeiten.
Um diese zu aktivieren unternehmen Sie folgende Schritte:
Die SAP Integration Suite bietet mit dem API-Management eine zentrale Plattform für alle Schnittstellen in Ihrer Systemlandschaft. Diese Plattform erleichtert nicht nur die Administration, sondern bietet auch Möglichkeiten, über Regelwerke (Policies) zusätzliche Sicherheitsvorkehrungen zu treffen, wie z.B. eigene Authentifizierungsflows oder IP-Whitelisting.
Die Erstellung eines API-Providers ist optional, aber durchaus empfehlenswert. Falls Sie diesen Schritt überspringen möchten, verwenden Sie im Integrationsflow bitte die URL des jeweiligen OData Services aus dem Public Cloud-System.
Sie können nach Anlage und Freigabe des Proxies prüfen, ob sich der Service aufrufen lässt. Navigieren Sie dazu in den Tab „Resources“ und öffnen Sie den ersten Eintrag. Klicken Sie auf „Try it out“.
Für den Service müssen Sie sich authentifizieren. Um den entsprechenden Header zu setzen, können Sie auf „Add“ -> „Header“ klicken.
Scrollen Sie weiter nach unten, bis Sie das neue Feld finden. Geben Sie hier folgende Werte ein:
Der Base64-String setzt sich aus dem Namen und Passwort des Kommunikationsbenutzers zusammen, welche durch einen Doppelpunkt getrennt und anschließend in base64 encodiert wurden.
Haben Sie z.B. folgende Daten für den Kommunikationsbenutzer:
können Sie mit dem folgenden Befehl in der Windows Powershell ausführen:
Ersetzen Sie jeweils den Nutzernamen und das Passwort.
$plainText = „cpro-cpi-article-user:super-secret“
$bytes = [System.Text.Encoding]::UTF8.GetBytes($plainText)
$base64 = [Convert]::ToBase64String($bytes)
Write-Output $base64
Klicken Sie anschließend auf „Execute“. Wenn Sie einen Code 200 erhalten, ist der API-Proxy erfolgreich für die Nutzung freigeschaltet.
Nachdem Sie validiert haben, dass der Proxy aufrufbar ist, erstellen Sie noch den API-Proxy für den Verfügbarkeitsservice und geben Sie diesen frei. Der Ablauf ist analog zur Anlage des Proxies für die Verkaufsbelege.
In der Integrationsentwicklung gilt es als Best-Practice, Zugangsdaten nicht direkt im Integrationsprozess zu hinterlegen. Stattdessen sollten Sie sowohl das Shopify-Token als auch den Nutzernamen und das Passwort als Credentials im Integration Suite Secret Store hinterlegen.
Sie können hier neben Zugangsdaten auch sogenannte „Secure Parameters“ hinterlegen. Diese Parameter können später in einem iFlow sicher ausgelesen – und übergreifend für alle Flows, die sie verwenden, rotiert werden. Sofern sich also das Shopify Token ändert, können Sie es hier hinterlegen und es wird automatisch an alle Flows, die das Token verwenden, propagiert
Um Nachrichten an den Integrationsflow zu senden, benötigen Sie eine spezielle Rolle namens „ESMB.send“. Diese könnten Sie über eine Rollensammlung direkt unserem User zuweisen, was sich gut für die Entwicklung eignet, aber nicht für eine produktive Umgebung. Stattdessen legen Sie spezielle Credentials an, die als Substitut für Nutzername und Passwort verwendet werden.
Da nun alle Vorbereitungen abgeschlossen sind, können Sie sich dem Flow selbst widmen. Navigieren Sie dazu zu „Design“ -> „Integrations and APIs“ und legen Sie ein neues Paket an:
Legen Sie ein neues Paket an und klicken Sie auf „Save“.
Öffnen Sie anschließend das neu erstellte Paket, klicken Sie auf den Reiter „Artifacts“ -> „Add“ -> „Integration Flow“.
Tragen Sie einen sinnvollen Namen für den neuen iFlow ein und klicken Sie auf „Add and Open in Editor“.
In dem neu erstellten Flow müssen Sie nun folgende Komponenten hinzufügen:
Navigieren Sie in den neu erstellten Integrationsflow. Verbinden Sie den „Sender“ mit dem Message-Start-Event und wählen Sie als Adapter HTTPS aus.
Geben Sie eine URL-Adresse ein und entfernen Sie den Haken bei CSRF-Protected.
Sichern und deployen Sie den Flow. Klicken Sie auf „Deployment Status“ und dann auf „Navigate to Manage Integration Content, um die vollständige URL des Endpunktes einzusehen.
Diese URL werden Sie später bei der Erstellung des Webhooks im Event-Mesh verwenden.
Sie können nun die Verbindung mit einem HTTP-Client wie Bruno oder Postman testen. Geben sie dazu Ihre URL als Empfänger und die Credentials, die Sie im Schritt „Anlage Integration Suite User“ erhalten haben, als Basic-Authentication ein.
Erhalten Sie den Statuscode 200, ist der Flow bereit, Nachrichten zu empfangen. Sie können den HTTP-Client nun weiterverwenden, um während der Flow-Entwicklung Tests durchzuführen. Nutzen Sie dazu die Daten aus dem Punkt „Konfiguration der Eventsteuerung“.
Um die Positionen des Verkaufsbelegs zu lesen, brauchen Sie die Nummer des Verkaufsbelegs. Diese erhalten Sie durch das Event aus dem Event Mesh. Welche Werte aus dem Event übertragen werden, haben Sie unter „Konfiguration der Eventsteuerung“ bereits festgestellt. Diese Daten können Sie als Ausgangspunkt für den Flow verwenden.
Da es sich um JSON-formatierten Text handelt, müssen Sie ihn zunächst in XML konvertieren. Nutzen Sie hierfür einen JSON-XML-Converter. Diesen finden Sie im Reiter „Transformation“ -> „Converter“ -> „XML to JSON Converter“. Weitere Änderungen an dem Adapter sind nicht notwendig.
Fügen Sie einen „Content Modifier“ ein und setzen Sie das folgende Exchange Property:
Fügen Sie einen neuen „Receiver“ unter den Flow hinzu. Wählen Sie dann den Adaptertyp „OData“ aus. Fügen Sie die folgenden Konfigurationen im Reiter „Connection“ ein:
Klicken Sie anschließend auf „Processing“. Hier können Sie entweder den OData-Query Wizard von SAP verwenden oder einfach die folgenden Einträge einfügen:
Mit dieser Konfiguration lesen Sie alle relevanten Informationen zum Verkaufsbeleg aus.
Führen Sie nun den POST-Request in Ihrem HTTP-Client aus. Sie sollten nun beide Materialien in der XML-Struktur auslesen können, die aus dem OData Service zurückgegeben wird.
Der Flow sollte nun wie folgt aussehen:
Im Folgeprozess betrachten Sie nicht mehr den Verkaufsbeleg, sondern seine Einzelpositionen. Daher müssen Sie zunächst einen Splitter einfügen, um jedes Material separat zu handhaben.
Erstellen Sie dazu in Ihrem Flow einen „General Splitter“ und konfigurieren Sie Ihn wie folgt:
Fügen Sie einen „Content-Modifier“ ein, um die folgenden Exchange Properties anzulegen.
Material:
Datum:
Shopify verwendet für die Anpassung der Lagerbestände interne Artikelnummern, die Sie zunächst ermitteln müssen.
Bevor Sie eine Anfrage tätigen, müssen Sie das Shopify-Token aus Ihrem Credential Store auslesen. In unserem Fall ist das Token als Secure-Parameter mit dem Naman „Shopify_API_Token“ hinterlegt. Auf diesen Parameter haben Sie mithilfe eines Groovy-Skiptes Zugriff.
Fügen Sie ein „Groovy Script“ in Ihren Flow ein. Geben Sie den folgenden Code ein:
import com.sap.gateway.ip.core.customdev.util.Message
import com.sap.it.api.ITApiFactory
import com.sap.it.api.securestore.SecureStoreService
def Message processData(Message message) {
// Get the SecureStoreService
def secureStorageService = ITApiFactory.getService(SecureStoreService.class, null)
// Retrieve the secure parameter
def secureParameter = secureStorageService.getUserCredential(„Shopify_API_Token“)
if (secureParameter != null) {
// Store the secure parameter value in a message property
def secureParameterValue = secureParameter.getPassword().toString()
message.setProperty(„Webshop_Token“, secureParameterValue)
} else {
throw new RuntimeException(„No credentials maintained for ‚ Shopify_API_Token ‚“)
}
return message
}
Dieses Skript setzt das Exchange Property namens „Webshop_Token“ auf den Wert des Shopify-API Tokens.
Fügen Sie anschließend einen Content-Modifier ein, um das Token als Header-Wert zu setzen.
Fügen Sie als nächstes einen Request-Reply Adapter vom Typ „HTTP“ ein. Konfigurieren Sie diesen wie folgt:
Fügen Sie anschließend einen „JSON to XML“-Transformationsadapter und einen „Content-Modifier“ ein. Konfigurieren Sie diesen wie folgt:
Im ausgelesenen Auftragen finden Sie zwei Produkte, für die Verfügbarkeiten ausgelesen und übertragen werden. Wie bereits beim Auslesen der Shopify-Materialnummer müssen Sie auch hier jedes Material einzeln aus SAP auslesen.
Fügen Sie einen Request-Reply Adapter vom Typ OData ein. Konfigurieren Sie diesen wie folgt im Connection Tab.
Auch hier können Sie entweder den API-Proxy verwenden oder den Public Cloud Endpunkt selbst.
Im Tab Processing geben Sie Folgendes ein:
Um den Prozess zu testen, können Sie nun optional einen Temporären „Gather“-Adapter einfügen, um alle Forecastdaten zusammenzuführen.
Prüfen Sie die Daten nun in Ihrem HTTP-Client. Sie erhalten je Material aus dem Verkaufsbeleg genau einen Forecast-Wert.
Dieser Teil des Flows sieht nun bis hierher so aus:
Das Zielformat für die Shopify-API im JSON-Format besteht aus drei Teilen:
Hinweis: Die Location-ID können Sie über den Endpunkt /admin/api/2025-04/locations.json auslesen, der Einfachheit halber behandeln wir in diesem Artikel einen statischen Wert.
Diese Transformation nehmen Sie über Javascript vor. Fügen Sie, nach dem Forecast-OData Adapter, eine XML-JSON Transformation durch.
Ein Forecast hat nun das folgende Format:
Fügen Sie anschließend ein neues Javascript-Skript ein. Javascript in der CPI eignet sich besonders gut dafür, mit JSON zu arbeiten.
Fügen Sie also einen neuen Javascript Adapter hinzu mit dem folgenden Code:
/**
* @description Transformation logic to convert one or multiple forcasts
* received by `API_PRODUCT_AVAILY_INFO_BASIC/CalculateAvailabilityTimeseries`.
* to the Shopify Inventory format
*
* @version 1.1.0
* @author CPRO INDUSTRY Projects and Solutions GmbH
*/
// importClass(com.sap.gateway.ip.core.customdev.util.Message);
function processData(message) {
const payload = message.getBody(java.lang.String);
const json = JSON.parse(payload);
// Set availability to 0 if it’s smaller than 0
let availability = +json.DetermineAvailabilityAt.AvailabilityRecord.AvailableQuantityInBaseUnit
if(availability < 0) {
availability = 0;
}
// Set shopify Payload
const availability_data = {
location_id: 105515843915,
inventory_item_id: +message.getProperty(‚ShopifyItemId‘),
available: availability
}
// Set message body to JSON-String
message.setBody(JSON.stringify(availability_data))
return message;
}
Dieser Code transformiert jedes Item in das von der Shopify-API verlangte Format. Ein Beispiel-Payload sieht so aus:
In meinem Demoshop habe ich nun die beiden Produkte angelegt:
Wie Sie sehen können, sind beide mit Beständen von 10 bzw. 15 Stück gelistet. Nachdem ich die Daten aus dem SAP-System übertragen habe, sollten beide Bestände auf 0 gesetzt werden.
Legen Sie nun einen finalen Request-Reply Adapter vom Typ HTTP an mit der folgenden Konfiguration:
Nach Durchführung des Tests mit dem HTTP-Client und Update der Shop-Seite werden mir nun die Bestände beider Artikel korrekterweise als 0 angezeigt.
Der iFlow ist damit technisch fertig entwickelt. Wir könnten abschließend noch Optimierungen wie Fehlerhandling, Externalisierung von Parametern oder Logging als Features hinzufügen. Da diese Anpassungen sehr individuell sind, lassen wir sie hier heraus und gehen zum letzten Punkt über.
Bevor Sie die Änderungen endgültig testen können, muss noch die eventgesteuerte Automatisierung eingestellt werden. Erledigen Sie dies im Event Mesh der SAP BTP.
Legen Sie aber zunächst einen neuen Auftrag im Public Cloud-System an, den unsere Queue registriert. Darüber hinaus setzen Sie die Mengen im Shopify-Webshop wieder hoch.
Öffnen Sie in Ihrem Public Cloud-System die App „Kundenaufträge Anlegen“ und wählen den Auftragstyp „TA“ aus. Klicken Sie auf „Weiter“. Legen Sie dort einen neuen Auftrag an, z.B. so
Sobald Sie diesen Auftrag sichern, sollte in der EventMesh Queue eine Nachricht registriert werden:
Navigieren Sie nun zu „Webhooks“ und klicken Sie auf „Create Webhook“. Geben Sie hier die folgenden Daten ein:
Klicken Sie nun auf „Create“. Die Nachricht aus dem Event Mesh wird umgehend an die CPI versendet. Sie können dies im „Monitor Message Processing“ in der SAP Integration Suite überprüfen.
Prüfen Sie abschließend den Shopify-Bestand, sehen Sie, dass die Werte durch Ihren Integrationsflow korrekt überschrieben wurden:
Die hier vorgestellte Methodik lässt sich, neben der Übertragung von Daten auf Webshops, universell ausweiten. Die Echtzeitverarbeitung in der Integration Suite eignet sich hervorragend für alle Geschäftsprozesse, bei denen Zeit der entscheidende Faktor ist. Ob die Synchronisation von Stammdaten in Subsystemen oder das Verteilen von wichtigen Messwertänderungen an Produkten – mit der Event-basierten Architektur sind Sie immer einen Schritt voraus.







Ihr bisheriger Anbieter ist jetzt CPRO. Sie wurden automatisch auf unsere neue Website weitergeleitet. Für Sie ändert sich nur der Markenauftritt: Ihre Verträge behalten ihre Gültigkeit, Ihre Ansprechpartner und die Gesellschaft als Ihr Vertragspartner bleiben unverändert. Wir freuen uns, Sie hier begrüßen zu dürfen!
Sie sehen gerade einen Platzhalterinhalt von Vimeo. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr InformationenSie sehen gerade einen Platzhalterinhalt von YouTube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr InformationenSie müssen den Inhalt von reCAPTCHA laden, um das Formular abzuschicken. Bitte beachten Sie, dass dabei Daten mit Drittanbietern ausgetauscht werden.
Mehr InformationenSie sehen gerade einen Platzhalterinhalt von Google Maps. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr InformationenSie sehen gerade einen Platzhalterinhalt von Google Maps. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr InformationenSie sehen gerade einen Platzhalterinhalt von Mapbox. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr InformationenSie sehen gerade einen Platzhalterinhalt von OpenStreetMap. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr Informationen