https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/Cloud-Integration-blog-posts.xmlSAP Community - Cloud Integration2026-07-24T20:00:09.170495+00:00python-feedgenCloud Integration blog posts in SAP Communityhttps://community.sap.com/t5/integration-blog-posts/pass-xi-message-id-from-end-to-end/ba-p/14436255Pass XI message ID from end-to-end2026-07-15T22:57:19.662000+02:00alex_bundschuhhttps://community.sap.com/t5/user/viewprofilepage/user-id/45178<P>With the new version of the <SPAN>Pipeline for Cloud Integration packages, see <A href="https://community.sap.com/t5/integration-blog-posts/new-features-in-the-pipeline-for-cloud-integration-packages-with-the-july/ba-p/14436194" target="_blank">New features in the Pipeline for Cloud Integration packages with the July 2026 shipment</A>, we have enhanced the generic XI inbound processing flow as well as the generic XI outbound processing flow to be able to <STRONG>pass the XI message ID from end-to-end</STRONG>. This enhancement was actually added based on a customer requirement. For specific scenarios where both the sender and the receiver use the XI 3.0 protocol, the customer likes to keep the sender XI message ID the same like in the receiving system to be able to track the message from end-to-end.</SPAN></P><P><SPAN>You can enable the feature for a specific configuration scenario by maintaining the string parameter <EM>PassMessageIdFromE2E</EM> in the partner ID representing your configuration scenario in the Partner Directory.</SPAN></P><P>We intentionally did not introduce this feature as a global setting because you need to use this setting with caution. Wrongly used, this may lead to data loss. For example, if you duplicate or split up your message in your scenario-specific outbound processing flow that calls the generic XI outbound flow and each split message is sent to the same receiver, only the first message will be processed in the receiver system, all other messages are seen as duplicates in the receiver system because they have the same XI message ID which was successfully processed before and hence they will be discarded leading to data loss. We have implemented a check which will only work when using an iterative splitter or a generic splitter in your scenario-specific outbound processing flow to split up the message. In this case, even if the <SPAN>parameter <EM>PassMessageIdFromE2E</EM></SPAN> is set, this setting will be ignored and a new unique ID for each split message is generated. If you use whatever other way to split up the message, the check won't work. So, as said, use this with caution and enable it only for use cases where you are sure that this won't lead to any harm.</P><P>So, now let's check how this can be configured and how this behaves. I have setup a configuration scenario of pattern Content-Based Router. For one receiver, I run a one-to-many message mapping to split the message. For another receiver, I only pass one message to the receiver.</P><P>In case you are not familiar with scenarios using the generic XI outbound processing flow, check out this blog post <A href="https://community.sap.com/t5/integration-blog-posts/generic-xi-outbound-flow-in-cloud-integration-pipeline/ba-p/14269061" target="_blank">Generic XI Outbound flow in Cloud Integration Pipeline</A>. For a better understanding, I schematically show you the message flow:</P><P><FONT color="#FF6600">Sender</FONT> --via XI protocol--> <FONT color="#0000FF">Generic XI Inbound Processing flow</FONT> --via JMS adapter--> <FONT color="#008000">First JMS Queue</FONT> --via JMS adapter--> <FONT color="#0000FF">Integrated Messaging Pipeline flow</FONT> --via JMS adapter--> <FONT color="#008000">Second JMS Queue</FONT> --via JMS adapter--> <FONT color="#0000FF">Generic Outbound Processing flow</FONT> --via ProcessDirect--> <FONT color="#0000FF">Scenario-specific Outbound Processing flow</FONT> --via ProcessDirect--> <FONT color="#0000FF">Generic XI Outbound Processing flow</FONT> --via XI protocol--> <FONT color="#FF6600">Receiver</FONT></P><P>So, in the <FONT color="#0000FF">Generic XI Inbound Processing flow</FONT> I fetch the XI message ID from the <FONT color="#FF6600">Sender</FONT>, store it in a header and route this through all flows. The <FONT color="#0000FF">Generic XI Inbound Processing flow</FONT> stores the message in the <FONT color="#008000">first JMS queue</FONT> where it is picked up by the <FONT color="#0000FF">Integrated Messaging Pipeline flow</FONT>. The <FONT color="#0000FF">Integrated Messaging Pipeline flow</FONT> carries out the xpath conditions to determine the receiver/s and then stores the message in the <FONT color="#008000">second JMS queue</FONT> for each receiver. In our case, we always have one receiver only at the same time. The <FONT color="#0000FF">Generic Outbound Processing flow</FONT> picks up the message/s from the <FONT color="#008000">second JMS queue</FONT> and now tries to deliver this to the receiver. It calls the <FONT color="#0000FF">Scenario-specific Outbound Processing flow</FONT> via ProcessDirect where the actual mapping is carried out and eventually the XI connection parameters are set. The connection to the <FONT color="#FF6600">Receiver</FONT> is then done via the <FONT color="#0000FF">Generic XI Outbound Processing flow</FONT> which acts as a sort of channel. If configured, we use the XI message ID from the <FONT color="#FF6600">Sender</FONT> to create the XI message ID at the <FONT color="#FF6600">Receiver</FONT>.</P><P>So, the screenshot below shows the scenario-specific integration flow where we split up the message. As you can see, we run a one-to-many message mapping, the result is a multi message which is embedded in Messages nodes. We need to get rid of the additional nodes and split up the message into multiple messages. This we do using an iterative splitter. The iterative splitter by the way adds a specific header to the exchange which we pass to the next flow which is the generic XI outbound processing flow where we check if this header is present and if so discard the use of the sender XI message ID. Furthermore, in a content modifier we need to add the Camel split index to the unique ID header so that each split message has a unique ID.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Flow with split.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430818i16DC57267F3CF49A/image-size/large?v=v2&px=999" role="button" title="Flow with split.png" alt="Flow with split.png" /></span></P><P>And the following screenshot shows the scenario-specific integration flow with a simple 1:1 mapping resulting in one single message. In this case, we can keep the unique ID header unchanged. But it won't be used anyway because we will pass the XI message ID from the sender to the XI receiver adapter in the generic XI outbound processing flow anyway.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Receiver with no split.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430819i88665EB353114CBF/image-size/large?v=v2&px=999" role="button" title="Receiver with no split.png" alt="Receiver with no split.png" /></span></P><P>I like to enable the feature for my scenario, at least for those cases were I do not do a split. In the Partner Directory, I add a new string parameter with ID <SPAN><STRONG>PassMessageIdFromE2E</STRONG> and value <STRONG>true</STRONG> to the partner ID representing my configuration scenario.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CS in PD.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430820iE063F8BF7D518470/image-size/large?v=v2&px=999" role="button" title="CS in PD.png" alt="CS in PD.png" /></span></SPAN></P><P><SPAN>Now, I run some tests. First, let's see how the end-to-end XI message ID feature works. In this case, in the message monitor I click on the Application Message ID and this will then automatically filter all logs that belong to the same Application Message ID. Here, the Application Message ID is actually the sender XI message ID. So, you can see that both, the generic XI inbound processing flow as well as the generic XI outbound processing flow have the same XI message ID. I only mocked the sender and receiver but in a real scenario the corresponding messages in the sender and the receiver system would be the same.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="P2P where XI message ID is passed through.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430821iAE0521DCD99E7884/image-size/large?v=v2&px=999" role="button" title="P2P where XI message ID is passed through.png" alt="P2P where XI message ID is passed through.png" /></span></SPAN></P><P><SPAN>For another test message that I sent, the split is carried out. Here, I now click on the Correlation ID to be able to see all logs of the same exchange. Since we did a split, you see two logs of the generic XI outbound processing flow. If I clicked on the Application Message ID, you would not see all logs because the generic XI outbound processing flows have a different XI message ID and hence Application Message ID. Here, the check popped in. Because we did a split in the flow before, the unique ID header is used to generate the XI message ID instead of using the sender XI message ID. You remember, the unique ID header was modified by adding the slit index, so this ensures that the XI message IDs of the split messages differ. So, in this case you can't track the XI message ID from end-to-end but at least we add the sender XI message ID to the custom header properties. If we identify a split, we store the sender XI message ID in the custom header <STRONG>ParentIdBeforeMessageSplit</STRONG>.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Split message.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430822i5908F761313F14ED/image-size/large?v=v2&px=999" role="button" title="Split message.png" alt="Split message.png" /></span></SPAN></P><P>Hope this new feature is of value for you. As usually, feedback is highly appreciated.</P>2026-07-15T22:57:19.662000+02:00https://community.sap.com/t5/integration-blog-posts/new-skip-retry-handling-feature-in-the-pipeline-for-cloud-integration-with/ba-p/14437784New Skip Retry Handling feature in the Pipeline for Cloud Integration with the July 2026 shipment2026-07-15T22:57:30.153000+02:00mate_moriczhttps://community.sap.com/t5/user/viewprofilepage/user-id/191315<DIV class=""><DIV class=""><DIV class=""><P><SPAN>In some error cases, an automatic retry doesn’t help, it just adds load on the tenant runtime without fixing anything. For those cases, you can skip the standard retry handling and send the failed messages directly to the Dead Letter Queue (DLQ). That’s exactly the purpose of the new "Skip Retry Handling" feature in the Pipeline for Cloud Integration (July 2026 shipment). This blog covers when retries are skipped by default, and how you can adjust the behavior globally or per scenario.</SPAN></P></DIV></DIV><DIV class=""><H2 id="toc-hId-1819228830">How “Skip Retry Handling” Helps</H2><UL class=""><LI>The tenant stops wasting runtime on errors that will never succeed.</LI><LI>Failures land in the DLQ quickly, so you can actually see what broke instead of digging through retry noise.</LI><LI>You can leave the defaults alone, or tune the behavior globally or per scenario.</LI></UL><H2 id="toc-hId-1622715325">Where Retries Are Skipped by Default</H2><DIV class="">For the integrated messaging runtime (including the Generic Receiver Determination and Interface Determination flows), retries are skipped and messages go straight to the DLQ in these cases:</DIV><UL class=""><LI>Partner ID could not be determined.</LI><LI>Configuration option not supported.</LI><LI>Receiver could not be determined when “Receiver Not Found” is set to Error.</LI><LI>Receiver interface could not be determined.</LI></UL><DIV class="">For all other error cases (in these components), the standard retry handling applies.</DIV></DIV><H2 id="toc-hId-1426201820">Tuning Skip Retries in Generic Outbound Processing</H2><DIV class="">For the Generic Outbound Processing flow, you can fine-tune how skip retry handling works. Two control levels exist:</DIV><UL class=""><LI>Global settings (apply to all copied Generic Outbound flows—unless overridden)</LI><LI>Scenario-specific settings (per integration scenario via Partner Directory)</LI></UL><DIV class="">By default, the global skip is enabled:</DIV><UL class=""><LI>Parameter:<SPAN> </SPAN><CODE>SkipRetriesGlobal_Enabled = true</CODE></LI></UL><H3 id="toc-hId-1358771034">Configuration options</H3><DIV><DIV class=""><TABLE><TBODY><TR><TD><STRONG>Option</STRONG></TD><TD><STRONG>How to Activate</STRONG></TD><TD><STRONG>What it does</STRONG></TD><TD><STRONG>When to use?</STRONG></TD></TR><TR><TD>Default (Hard-coded)</TD><TD><CODE>SkipRetriesGlobal_Source = Default</CODE></TD><TD>Skips retries only for Mapping errors (<CODE>com.sap.xi.mapping.camel.XiMappingException</CODE>)</TD><TD>Good baseline if mapping errors are your main non-transient case</TD></TR><TR><TD>Global via Value Mapping</TD><TD><CODE>SkipRetriesGlobal_Source = ValueMapping</CODE><SPAN> </SPAN>and deploy the “Pipeline V2 - Value Mapping - Skip Retry Configuration”</TD><TD>Centralizes per-exception-class settings in a value mapping</TD><TD>When you want one global control point for all scenarios</TD></TR><TR><TD>Global via Partner ID Profile</TD><TD><CODE>SkipRetriesGlobal_Source = PartnerDirectory</CODE><SPAN> </SPAN>plus a Partner ID profile</TD><TD>Lets you define a skip-retry profile (exception classes set to true) and reuse across copies of the outbound flow</TD><TD>Ideal for multi-unit tenants where each unit needs its own profile</TD></TR><TR><TD>Scenario-specific Profile</TD><TD>Set<SPAN> </SPAN><CODE>SkipRetriesProfile</CODE><SPAN> </SPAN>on the Partner ID that represents the scenario</TD><TD>Overrides global settings just for that scenario</TD><TD>When certain scenarios need stricter or looser retry rules</TD></TR></TBODY></TABLE></DIV></DIV><H2 id="toc-hId-1033174810">Examples</H2><H3 id="toc-hId-965744024">Example 1: Mapping Errors</H3><P>Symptoms:</P><UL class=""><LI>Messages fail with mapping exceptions.</LI><LI>Reprocessing without changing the mapping yields the same error. Messages can't be edited directly as they could be done in SAP Process Orchestration.</LI></UL><DIV class="">Setup:</DIV><UL class=""><LI>Keep<SPAN> </SPAN><CODE>SkipRetriesGlobal_Enabled = true</CODE></LI><LI>Keep<SPAN> </SPAN><CODE>SkipRetriesGlobal_Source = Default</CODE></LI></UL><DIV class="">Result:</DIV><UL class=""><LI>Mapping exceptions (<CODE>com.sap.xi.mapping.camel.XiMappingException</CODE>) go straight to DLQ.</LI><LI>The Integration/Operations teams can focus on either fixing the mapping or fixing the functional data.</LI></UL><H3 id="toc-hId-769230519">Example 2: Receiver Not Found</H3><P>Scenario:</P><UL class=""><LI>You enforce strict routing rules—if a receiver cannot be determined and “Receiver Not Found” is set to Error, there is no fallback.</LI></UL><DIV class="">Result:</DIV><UL class=""><LI>Integrated messaging runtime already skips retries and puts the failure in DLQ. No extra config required.</LI></UL><H3 id="toc-hId-572717014">Example 3: Scenario-based Retry Profiles</H3><P>Attach profiles to scenarios so each scenario can apply its own skip behavior without duplicating flows.</P><P><SPAN>Scenario:</SPAN></P><UL class=""><LI>Scenario A (“Order-to-Cash Outbound”): skip retries for mapping errors only.</LI><LI>Scenario B (“Billing to CRM”): skip retries for mapping errors and known and expected script failures</LI></UL><DIV class="">Setup (Partner Directory profiles):</DIV><UL class=""><LI>Create profile “SkipProfile_Scenario_O2C”: set<SPAN> </SPAN><CODE>com.sap.xi.mapping.camel.XiMappingException = true</CODE>.</LI><LI>Create profile “<SPAN>SkipProfile_Scenario_BillingCRM</SPAN>”: set<SPAN> </SPAN><CODE>com.sap.xi.mapping.camel.XiMappingException = true</CODE><SPAN> </SPAN>and<SPAN> </SPAN><CODE><SPAN>javax.script.ScriptException</SPAN> = true</CODE>.</LI><LI><SPAN>On the Partner ID for “Order-to-Cash Outbound”:</SPAN><BR /><UL class=""><LI><CODE><SPAN>SkipRetriesProfile</SPAN> = SkipProfile_Scenario_O2C</CODE></LI></UL></LI><LI>On the Partner ID for “Billing to CRM Sync”:</LI><UL class=""><LI><CODE>SkipRetriesProfile = <SPAN>SkipProfile_Scenario_BillingCRM</SPAN></CODE></LI></UL></UL><DIV class="">Result:</DIV><UL class=""><LI>Scenario A (“Order-to-Cash Outbound”) skips only mapping exceptions and retries everything else as usual.</LI><LI>Scenario B (“Billing to CRM”) skips mapping and<SPAN> </SPAN><CODE>javax.script.ScriptException</CODE>, while still retrying potentially transient connection issues (for example, timeouts).</LI></UL><H3 id="toc-hId-376203509">Example 4: A Single Scenario That Needs Stricter Skips</H3><DIV class="">Sometimes one scenario needs stricter rules than the rest. A classic case: SOAP faults on partner onboarding, where the fault usually means the payload or contract is wrong and no amount of retrying is going to change that.</DIV><DIV class="">Scenario:</DIV><UL class=""><LI>“Partner Onboarding (SOAP)” must never retry on SOAP faults because these typically point to permanent contract or payload issues.</LI></UL><DIV class="">Setup:</DIV><UL class=""><LI>Create a skip-retry profile "SkipProfile_Scenario_OnboardingStrict" with<SPAN> </SPAN><CODE>org.apache.cxf.binding.soap.SoapFault = true</CODE>.</LI><LI>In the Partner ID representing this scenario, add:<UL class=""><LI><CODE>SkipRetriesProfile = SkipProfile_Scenario_OnboardingStrict</CODE></LI></UL></LI></UL><DIV class="">Result:</DIV><UL class=""><LI>Only this scenario overrides the global policy and skips<SPAN> </SPAN><CODE>org.apache.cxf.binding.soap.SoapFault</CODE>.</LI></UL><H2 id="toc-hId-50607285">Configuration Options and Behavior</H2><H3 id="toc-hId--92054870">1) Default (Hard-coded)</H3><UL class=""><LI>In your Generic Outbound Processing flow:<UL class=""><LI><CODE>SkipRetriesGlobal_Enabled = true</CODE></LI><LI><CODE>SkipRetriesGlobal_Source = Default</CODE></LI></UL></LI></UL><DIV class="">Behavior: Only mapping exceptions skip retry (class<SPAN> </SPAN><CODE>com.sap.xi.mapping.camel.XiMappingException</CODE>).</DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mate_moricz_5-1783691333625.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/431702iBEF32332B80D10B8/image-size/large?v=v2&px=999" role="button" title="mate_moricz_5-1783691333625.png" alt="mate_moricz_5-1783691333625.png" /></span></DIV><H3 id="toc-hId--288568375">2) Global Value Mapping</H3><UL class=""><LI>Set<SPAN> </SPAN><CODE>SkipRetriesGlobal_Source = ValueMapping</CODE>.</LI><LI>Prerequisite: Deploy “Pipeline V2 - Value Mapping - Skip Retry Configuration” from the “Cloud Integration Pipeline - Templates” package.</LI><LI>Default behavior of the value mapping:<UL class=""><LI><CODE>com.sap.xi.mapping.camel.XiMappingException</CODE><SPAN> </SPAN>→ true</LI><LI>All other exceptions → false</LI></UL></LI><LI>To add/adjust behavior, edit values in the value mapping and redeploy.</LI></UL><DIV class="">When to choose: You want one centralized table to govern skip behavior across the tenant. Note <SPAN>you can't deploy a copy of the provided value mapping with the same combination of agency and scheme, choose this option if you like to customize the skip retry handling globally across all scenarios.</SPAN></DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mate_moricz_4-1783691280985.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/431701i6966CCFCBA9FE67B/image-size/large?v=v2&px=999" role="button" title="mate_moricz_4-1783691280985.png" alt="mate_moricz_4-1783691280985.png" /></span><P> </P></DIV><H3 id="toc-hId--485081880">3) Global Partner ID Profile (via Partner Directory)</H3><UL class=""><LI>Create a Partner ID that acts as your global skip-retry profile.</LI><LI>Add one string parameter per exception class to skip:<UL class=""><LI>Parameter ID = fully qualified exception class name</LI><LI>Value =<SPAN> </SPAN><CODE>true</CODE></LI></UL></LI><LI>In your Generic Outbound flow:<UL class=""><LI><CODE>SkipRetriesGlobal_Source = PartnerDirectory</CODE></LI><LI><CODE>SkipRetriesGlobal_SourcePidProfile = <YourProfileName></CODE></LI></UL></LI></UL><DIV class="">You can quickly bootstrap this profile from the value mapping using the helper iFlow (below).</DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mate_moricz_0-1783690906513.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/431686i671D6FE262E74056/image-size/large?v=v2&px=999" role="button" title="mate_moricz_0-1783690906513.png" alt="mate_moricz_0-1783690906513.png" /></span><P> </P></DIV><H4 id="toc-hId--974998392">Helper iFlow: Auto-generate a Profile From the Value Mapping</H4><UL class=""><LI>Use “Pipeline v2 - Partner Directory Upload Helper - Skip Retry Configuration.”</LI><LI>Prerequisites:<UL class=""><LI>In SAP BTP Cockpit Create a Service Instance for “SAP Process Integration Runtime” with plan<SPAN> </SPAN><CODE>api</CODE>as described on <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/oauth-with-client-credentials-grant-for-api-clients?locale=en-US&version=Cloud" target="_self" rel="noopener noreferrer">SAP Help Portal</A> and a corresponding service key. The required role for the service instance is AuthGroup_TenantPartnerDirectoryConfigurator.</LI></UL></LI><LI>Configure and deploy with:<UL class=""><LI><CODE>API_URL</CODE><SPAN> </SPAN>= tenant-specific OData API URL (from your service key)</LI><LI><CODE>API_Credential_Alias</CODE><SPAN> </SPAN>= alias of the OAuth2 Client Credentials</LI><LI><CODE>PartnerDirectory_PID</CODE><SPAN> </SPAN>= target profile name (default<SPAN> </SPAN><CODE>SAP_Integration_Suite_SkipRetryGlobalProfile</CODE>)</LI><LI><CODE>ValueMapping_TechnicalID</CODE><SPAN> </SPAN>=<SPAN> </SPAN><CODE>com.sap.integration.cloud.pipeline.v2.value.mapping.skipretry</CODE><SPAN> </SPAN>(default)</LI><LI><CODE>ValueMapping_Version</CODE><SPAN> </SPAN>=<SPAN> </SPAN><CODE>1.0.1</CODE><SPAN> </SPAN>(default)</LI></UL></LI></UL><DIV class="">The helper runs once per deployment, creates the Partner Directory profile, reads the value mapping, and writes exception class parameters with true/false. You can fine-tune afterward.</DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mate_moricz_3-1783691236874.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/431697iB5AD36874A9AAAFF/image-size/large?v=v2&px=999" role="button" title="mate_moricz_3-1783691236874.png" alt="mate_moricz_3-1783691236874.png" /></span><P> </P></DIV><H3 id="toc-hId--878108890">4) Scenario-specific Profile (Overrides Global)</H3><UL class=""><LI>First, create a skip-retry profile in Partner Directory (as above).</LI><LI>In the Partner ID representing your scenario, add:<UL class=""><LI><CODE>SkipRetriesProfile = <YourScenarioProfile></CODE></LI></UL></LI></UL><DIV class="">This setting overrides any global policy for that scenario.</DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mate_moricz_1-1783690978107.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/431687iD0982D30ABA03674/image-size/large?v=v2&px=999" role="button" title="mate_moricz_1-1783690978107.png" alt="mate_moricz_1-1783690978107.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mate_moricz_2-1783691177264.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/431692i9F5034550AEBB8BB/image-size/large?v=v2&px=999" role="button" title="mate_moricz_2-1783691177264.png" alt="mate_moricz_2-1783691177264.png" /></span><P> </P></DIV><H2 id="toc-hId--781219388">Points to consider</H2><UL class=""><LI>Don't over-skip:<UL class=""><LI>Timeouts, throttling, HTTP 5xx from backends usually resolve themselves on the next attempt. If you put these exception classes in the skip list, you’ll create incidents that would have healed on their own.</LI></UL></LI><LI>Copying value mappings incorrectly:<UL class=""><LI>You can’t deploy a copy with the same agency/scheme. If you need variety across teams, prefer Partner Directory profiles.</LI></UL></LI><LI>Forgetting scenario overrides:<UL class=""><LI>If a<SPAN> </SPAN><CODE>SkipRetriesProfile</CODE><SPAN> </SPAN>is set on a scenario’s Partner ID, it overrides global behavior—document and audit these.</LI></UL></LI><LI>Nobody's watching the DLQ<UL class=""><LI>Skipping retries only helps if someone watches and acts on the DLQ. Ensure processes for analysis, ticketing, and replay are in place. <SPAN>If you’d rather park these messages somewhere other than the DLQ, take a look at the </SPAN><A href="https://hub.sap.com/package/processintegrationpipelineextensionrestartviadatastore/overview" target="_self" rel="noopener noreferrer">Process Integration Pipeline Extension - Restart via Data Store</A> Community Package that allows you to store the messages in Data Stores. There’s a separate blog <A href="https://community.sap.com/t5/integration-blog-posts/process-integration-pipeline-extension-restart-via-data-store/ba-p/14153116" target="_self">post</A> covering it.</LI></UL></LI></UL><H2 id="toc-hId--977732893">Configuration Summary</H2><DIV class=""><STRONG>Global default (hard-coded):</STRONG></DIV><DIV class=""><CODE>SkipRetriesGlobal_Enabled = true </CODE></DIV><DIV class=""><CODE>SkipRetriesGlobal_Source = Default</CODE></DIV><DIV class=""><STRONG>Global via Value Mapping:</STRONG></DIV><DIV class=""><DIV class=""><CODE>SkipRetriesGlobal_Enabled = true </CODE></DIV><DIV class=""><CODE>SkipRetriesGlobal_Source = ValueMapping</CODE></DIV></DIV><DIV class=""><STRONG>Global via Partner Directory:</STRONG></DIV><DIV class=""><DIV class=""><CODE>SkipRetriesGlobal_Enabled = true </CODE></DIV><DIV class=""><CODE>SkipRetriesGlobal_Source = PartnerDirectory </CODE></DIV><DIV class=""><CODE>SkipRetriesGlobal_SourcePidProfile = SAP_Integration_Suite_SkipRetryGlobalProfile // or your profile</CODE></DIV></DIV><DIV class=""><STRONG>Scenario-specific override (on the scenario’s Partner ID):</STRONG></DIV><DIV class=""><CODE>SkipRetriesProfile = <YourScenarioProfile></CODE></DIV><H2 id="toc-hId--1174246398">FAQs</H2><UL class=""><LI><DIV class="">What happens to skipped messages?</DIV><UL class=""><LI>They go straight to the Dead Letter Queue (DLQ), where you can analyze and replay after fixing the cause. These messages will have the Custom Status "RetrySkipped".</LI></UL></LI><LI><DIV class="">Can I combine global and scenario-specific settings?</DIV><UL class=""><LI>Yes. The scenario-specific profile overrides the global setting for that scenario only.</LI></UL></LI><LI><DIV class="">What’s the fastest way to create a global profile?</DIV><UL class=""><LI>Use the helper iFlow “Pipeline v2 - Partner Directory Upload Helper - Skip Retry Configuration” to auto-generate a Partner Directory profile from the value mapping.</LI></UL></LI><LI><DIV class="">Do I need to copy the value mapping to change it?</DIV><UL class=""><LI>No. Use the provided “Pipeline V2 - Value Mapping - Skip Retry Configuration” and adjust mapped values. If you need different configuration by unit or flow, use Partner Directory profiles.</LI></UL></LI></UL><H2 id="toc-hId--1370759903">Wrap-up</H2><DIV class=""><DIV class=""><P>The "Skip Retry Handling" feature helps you avoid retrying messages that will never succeed. There are three ways to set it up:</P><UL><LI><STRONG>Stick with the defaults: </STRONG>Mapping errors get skipped automatically. No additional configuration required.</LI><LI><STRONG>Use Value Mapping: </STRONG>One place to control skip behavior across the whole tenant.</LI><LI><STRONG>Use Partner Directory profiles: </STRONG>Best when different scenarios or teams need different rules.</LI></UL></DIV><DIV class="">Start with whatever’s closest to your setup and adjust as you learn which errors in your landscape actually need to be skipped.</DIV></DIV></DIV>2026-07-15T22:57:30.153000+02:00https://community.sap.com/t5/integration-blog-posts/migrating-interfaces-with-dynamic-configuration-asma-from-sap-po-to-sap/ba-p/14434776Migrating Interfaces with Dynamic Configuration (ASMA) from SAP PO to SAP Integration Suite2026-07-17T11:50:36.016000+02:00hbcordeirohttps://community.sap.com/t5/user/viewprofilepage/user-id/1397437<H1 id="toc-hId-1690056709"><STRONG><SPAN>Migrating Interfaces with Dynamic Configuration (ASMA) from SAP Process Orchestration to SAP Integration Suite</SPAN></STRONG><SPAN> </SPAN></H1><P><SPAN>This article explains how to migrate integration interfaces that rely on Dynamic Configuration (Adapter-Specific Message Attributes, ASMA) from SAP Process Orchestration (PO) to SAP Cloud Integration. It covers the technical root cause, a practical step-by-step migration approach, and the PO library dependencies involved.</SPAN><SPAN> </SPAN></P><H2 id="toc-hId-1622625923"><STRONG><SPAN>What Is ASMA (Adapter-Specific Message Attributes)?</SPAN></STRONG><SPAN> </SPAN></H2><P><SPAN>When running integration scenarios in SAP Process Orchestration, integration developers often need to pass dynamic, context-specific values — such as a target filename, a dynamic URL path, or a SOAP action — from the sender adapter through the integration logic to a receiver adapter. The mechanism that enables this in SAP PO is called Adapter-Specific Message Attributes (ASMA).</SPAN><SPAN> </SPAN></P><P><SPAN>ASMA values are carried in a special container called Dynamic Configuration, which travels with the message throughout the SAP PO pipeline. They can be read and written in three ways:</SPAN><SPAN> </SPAN></P><OL><LI><STRONG><SPAN>UDF in Message Mapping: </SPAN></STRONG><SPAN>In User-Defined Functions (UDFs) within a message mapping using the Java API: DynamicConfiguration, DynamicConfigurationKey, StreamTransformationConstants.DYNAMIC_CONFIGURATION.</SPAN><SPAN> </SPAN></LI><LI><STRONG><SPAN>Java Mapping: </SPAN></STRONG><SPAN>In </SPAN><SPAN>a standalone Java Mapping class that extends AbstractTransformation, using input.getDynamicConfiguration() to read or write ASMA values directly on the TransformationInput object.</SPAN><SPAN> </SPAN></LI><LI><STRONG><SPAN>XSLT Mapping:</SPAN></STRONG><SPAN> Via the SAP XI Mapping API extension functions provided by the SAP XML Toolkit. These extension functions allow an XSLT stylesheet to call into the Dynamic Configuration container to read and write ASMA values at runtime.</SPAN><SPAN> </SPAN></LI></OL><P><STRONG><SPAN>Core API Dependencies for Dynamic Configuration</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>Dynamic Configuration API depends on two specific JAR files that are part of the Process Orchestration runtime. </SPAN><SPAN> </SPAN></P><TABLE><TBODY><TR><TD><P><STRONG><SPAN>JAR File</SPAN></STRONG><SPAN> </SPAN></P></TD><TD><P><STRONG><SPAN>Key Classes Provided</SPAN></STRONG><SPAN> </SPAN></P></TD><TD><P><STRONG><SPAN>Purpose</SPAN></STRONG><SPAN> </SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>com.sap.xpi.ib.mapping.lib.jar</SPAN></STRONG><SPAN> </SPAN></P></TD><TD><P><SPAN>AbstractTransformation, TransformationInput, TransformationOutput, StreamTransformationException, AbstractTrace</SPAN><SPAN> </SPAN></P></TD><TD><P><SPAN>Core mapping framework. All Java Mappings must extend AbstractTransformation and implement the transform() method.</SPAN><SPAN> </SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>com.sap.xi.mapping.tool.lib_api.jar</SPAN></STRONG><SPAN> </SPAN></P></TD><TD><P><SPAN>DynamicConfiguration, DynamicConfigurationKey, StreamTransformationConstants</SPAN><SPAN> </SPAN></P></TD><TD><P><SPAN>Dynamic Configuration API. Provides the typed container for reading and writing Adapter-Specific Message Attributes by namespace/attribute key.</SPAN><SPAN> </SPAN></P></TD></TR></TBODY></TABLE><P> </P><H2 id="toc-hId-1426112418"><STRONG><SPAN>So, how to migrate an Interface with ASMA Using the SAP Integration Suite capability?</SPAN></STRONG><SPAN> </SPAN></H2><P><STRONG><SPAN>1. Create a Data Extraction in Migration Assessment (<A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/migration-assessment" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/integration-suite/sap-integration-suite/migration-assessment</A>)</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>Run Migration Assessment first to connect to your SAP PO system, extract all integration artifacts, and evaluate each scenario. As we will explore in this post, extracting this data reveals both the complexity and the use of Dynamic Configuration.</SPAN><SPAN> </SPAN></P><P><SPAN>Rules identified:</SPAN><SPAN> </SPAN></P><UL><LI><SPAN>GMMCustomUDFUsageCount</SPAN><SPAN> </SPAN></LI><LI><SPAN>GMMCustomUDFDynamicConfiguration</SPAN><SPAN> </SPAN></LI><LI><SPAN>JAVAMDynamicConfiguration</SPAN><SPAN> </SPAN></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_0-1783354524302.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430075i9A49E883274D48A5/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_0-1783354524302.png" alt="hbcordeiro_0-1783354524302.png" /></span></P><P><SPAN> <STRONG>2. </STRONG></SPAN><STRONG><SPAN><STRONG>Migr</STRONG>ation Tooling (<A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/migration-tooling?q=migration+tool" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/integration-suite/sap-integration-suite/migration-tooling?q=migration+tool</A>)</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>Using the assessment results as input, proceed with the Migration Tool for scenarios classified as "Ready to migrate" or "Adjustment required." The tool semi-automatically generates iFlows in SAP Integration Suite based on templates derived from the SAP PO configuration. </SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_1-1783354524304.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430074i199808382DA6949D/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_1-1783354524304.png" alt="hbcordeiro_1-1783354524304.png" /></span></P><P><STRONG><SPAN>3.Outcome & Validation</SPAN></STRONG><SPAN> </SPAN></P><P><SPAN>After the migration, validate the migrated iFlows. The combined use of both tools ensures a structured, risk-reduced, and cost-efficient transition from SAP PO/PI to SAP Integration Suite.</SPAN><SPAN> </SPAN></P><H2 id="toc-hId-1229598913"><STRONG><SPAN>What Happens When You Migrate the Interfaces with ASMA</SPAN></STRONG><SPAN> </SPAN></H2><P><STRONG><SPAN>Let's have a look at this demo scenario:</SPAN></STRONG><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_2-1783354524305.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430073iB1883E1F60ADC676/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_2-1783354524305.png" alt="hbcordeiro_2-1783354524305.png" /></span></P><P> </P><P><SPAN>1. </SPAN><SPAN>Request Payload</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_3-1783354524306.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430077iF6FBE17B55779A25/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_3-1783354524306.png" alt="hbcordeiro_3-1783354524306.png" /></span></P><P><SPAN>2. Processing Logic</SPAN><SPAN> </SPAN></P><OL><LI><SPAN>Java mapping reads the input message, gets "action" and puts it into Dynamic Configuration attribute "THeaderSOAPACTION".</SPAN><SPAN> </SPAN></LI><LI><SPAN>XSLT Mapping converts the input into message into target format and store tag "message" into Dynamic Configuration attribute "inputMessage".</SPAN><SPAN> </SPAN></LI><LI><SPAN>Receiver Communication Channel sets the Dynamic Configuration attribute "THeaderSOAPACTION" into SOAPAction.</SPAN><SPAN> </SPAN></LI><LI><SPAN>Once the target system processes the message, there is a Graphical Mapping with “User Defined Functions (UDF)”. This function assign values coming from Dynamic Configuration Attributes, "THeaderSOAPACTION" and "inputMessage", and puts into the tags "dynAction" and "inputMessage" respectivelly.</SPAN><SPAN> </SPAN></LI></OL><P><SPAN> 3. </SPAN><SPAN>Response Payload</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_4-1783354524306.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430076i7CEEB1B3697A3AF1/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_4-1783354524306.png" alt="hbcordeiro_4-1783354524306.png" /></span></P><P> </P><P><STRONG><SPAN>Once the interface is migrated, you will find in your Integration Suite package the artifacts generated based on your SAP PO objects.</SPAN></STRONG><SPAN> </SPAN></P><P><STRONG><SPAN>Check the Interface (flow). You will see boxes representing the logic that was defined on your SAP PO with wrapper functions depending on your ASMA use case. </SPAN></STRONG><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_5-1783354524307.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430078i28755240D1E5A09D/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_5-1783354524307.png" alt="hbcordeiro_5-1783354524307.png" /></span></P><P> </P><P><STRONG><SPAN>JAVA MAPPING (Using Dynamic Configuration)</SPAN></STRONG><SPAN> – A wrapper class is generated by the Migration tool by default to provide temporary compatibility. While you can override the Java method to retain Dynamic Configuration logic, this approach is not recommended for production use. The preferred approach is to replace the Dynamic Configuration calls with message headers as described in the adaptation section below.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_6-1783354524308.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430081i86FBF740CC2D78FE/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_6-1783354524308.png" alt="hbcordeiro_6-1783354524308.png" /></span></P><P><SPAN> </SPAN><STRONG><SPAN>XSLT MAPPING (Using Dynamic Configuration) -</SPAN></STRONG><SPAN> The migrated XSLT artifact retains the SAP XI Mapping API calls. These must be adapted to use Cloud Integration-native header access mechanisms.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_7-1783354524309.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430080i2EFCCEC1C5822B0F/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_7-1783354524309.png" alt="hbcordeiro_7-1783354524309.png" /></span></P><P><STRONG><SPAN>GRAPHICAL MAPPING (Using Dynamic Configuration) -</SPAN></STRONG><SPAN> UDFs referencing the Dynamic Configuration API are migrated as-is and will require manual adaptation.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_8-1783354524310.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430079i32A8D9945A20311B/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_8-1783354524310.png" alt="hbcordeiro_8-1783354524310.png" /></span></P><P> </P><P><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_9-1783354524310.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430084iAA58BFB142540FC0/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_9-1783354524310.png" alt="hbcordeiro_9-1783354524310.png" /></span></P><H2 id="toc-hId-1033085408"><STRONG><SPAN>How to Adapt ASMA-Based Interfaces for Cloud Integration</SPAN></STRONG><SPAN> </SPAN></H2><P><SPAN>Evaluate your scenario — Identify all ASMA usages across Java Mappings, UDFs, and XSLT stylesheets. The Migration tool does not replace Dynamic Configuration logic.</SPAN><SPAN> </SPAN></P><P><SPAN>Understand how messages are processed by Cloud Integration. "Dynamic Values” are passed via named message headers or properties (set by a Content Modifier or Groovy Script step) not via a Dynamic Configuration container.</SPAN><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_10-1783354524311.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430082i1198377AB88DF2DC/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_10-1783354524311.png" alt="hbcordeiro_10-1783354524311.png" /></span></P><P> </P><P><SPAN> </SPAN><SPAN>In SAP Cloud Integration, the correct mechanism for passing dynamic values through an integration flow is via message headers or exchange properties. These are set in dedicated flow steps before the mapping executes and then referenced in the mapping logic or adapter configuration.</SPAN><SPAN> </SPAN></P><P><SPAN> </SPAN></P><TABLE><TBODY><TR><TD><P><STRONG><SPAN>Concept</SPAN></STRONG><SPAN> </SPAN></P></TD><TD><P><STRONG><SPAN>SAP PO (Examples)</SPAN></STRONG><SPAN> </SPAN></P></TD><TD><P><STRONG><SPAN>SAP Cloud Integration (Examples)</SPAN></STRONG><SPAN> </SPAN></P></TD></TR><TR><TD><P><SPAN>Dynamic value container</SPAN><SPAN> </SPAN></P></TD><TD><UL><LI><SPAN>Dynamic Configuration (ASMA)</SPAN><SPAN> </SPAN></LI></UL></TD><TD><UL><LI><SPAN>Message Headers</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Exchange Properties</SPAN><SPAN> </SPAN></LI></UL></TD></TR><TR><TD><P><SPAN>How values are set</SPAN><SPAN> </SPAN></P></TD><TD><UL><LI><SPAN>Java DynamicConfiguration.put()</SPAN><SPAN> </SPAN></LI></UL></TD><TD><UL><LI><SPAN>Content Modifier</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Groovy Script setProperty() / setHeaders()</SPAN><SPAN> </SPAN></LI></UL></TD></TR><TR><TD><P><SPAN>How values are read in mapping</SPAN><SPAN> </SPAN></P></TD><TD><UL><LI><SPAN>Java DynamicConfiguration.get()</SPAN><SPAN> </SPAN></LI></UL></TD><TD><UL><LI><SPAN>Content Modifier</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Graphical Mapping out-of-the-box functions to getProperty and getHeader</SPAN><SPAN> </SPAN></LI></UL><UL><LI><SPAN>Groovy Script getProperty() / getHeaders()</SPAN><SPAN> </SPAN></LI></UL></TD></TR><TR><TD><P><SPAN>Dynamic adapter config</SPAN><SPAN> </SPAN></P></TD><TD><UL><LI><SPAN>Adapter reads ASMA by namespace + attribute key</SPAN><SPAN> </SPAN></LI></UL></TD><TD><UL><LI><SPAN>Adapter uses expression ${header.HEADER_NAME} or ${property.PROPERTY_NAME}</SPAN><SPAN> </SPAN></LI></UL></TD></TR></TBODY></TABLE><P><SPAN> </SPAN></P><P><SPAN>Therefore, if an imported mapping uses Dynamic Configuration APIs for accessing Adapter-Specific Message Attributes, the integration flow must be manually adjusted to ensure correct execution. </SPAN><SPAN> </SPAN></P><P><SPAN> </SPAN></P><TABLE><TBODY><TR><TD><P><STRONG><SPAN>References</SPAN></STRONG><SPAN> </SPAN></P></TD><TD><P><STRONG><SPAN>Links</SPAN></STRONG><SPAN> </SPAN></P></TD></TR><TR><TD><P><SPAN>Creating Message Mapping as an Artifact</SPAN><SPAN> </SPAN></P></TD><TD><P><SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/developing-message-mapping-as-artifact?locale=en-US" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/integration-suite/sap-integration-suite/developing-message-mapping-as-artifact?locale=en-US</A></SPAN><SPAN> </SPAN></P></TD></TR><TR><TD><P><SPAN>Headers and Exchange Properties Provided by the Integration Framework</SPAN><SPAN> </SPAN></P></TD><TD><P><SPAN><A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/headers-and-exchange-properties-provided-by-integration-framework" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/cloud-integration/sap-cloud-integration/headers-and-exchange-properties-provided-by-integration-framework</A></SPAN><SPAN> </SPAN></P></TD></TR><TR><TD><P><SPAN>Access Headers and Properties in Scripts</SPAN><SPAN> </SPAN></P></TD><TD><P><SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/access-headers-and-properties-in-scripts" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/integration-suite/sap-integration-suite/access-headers-and-properties-in-scripts</A></SPAN><SPAN> </SPAN></P></TD></TR></TBODY></TABLE><P><SPAN> </SPAN></P><P><SPAN> </SPAN></P><H2 id="toc-hId-836571903"><STRONG><SPAN>Let's Review the Integration Flow Imported in the Previous Steps and Look into Adaptations</SPAN></STRONG><SPAN> </SPAN></H2><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_11-1783354524311.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430083i7305DD3FB8F293FD/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_11-1783354524311.png" alt="hbcordeiro_11-1783354524311.png" /></span></P><P> </P><P><SPAN> <STRONG>1. </STRONG></SPAN><STRONG><SPAN>Java Mapping Replacement: A Content Modifier step is added before the mapping to set the SOAPAction message header and store the inputMessage value into message property. This replaces the Dynamic Configuration to write operations previously performed in Java Mapping.</SPAN></STRONG><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_12-1783354524312.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430085i91F50DCC3856A1A2/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_12-1783354524312.png" alt="hbcordeiro_12-1783354524312.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_13-1783354524312.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430086iE1B878D865E7EE10/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_13-1783354524312.png" alt="hbcordeiro_13-1783354524312.png" /></span></P><P><SPAN> </SPAN></P><P><SPAN> <STRONG>2. </STRONG></SPAN><STRONG><SPAN>XSLT Mapping: Remove Dynamic Configuration functionalities</SPAN></STRONG><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_14-1783354524312.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430087iAE9FE43089891C1A/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_14-1783354524312.png" alt="hbcordeiro_14-1783354524312.png" /></span></P><P> </P><P><SPAN> <STRONG>3. </STRONG></SPAN><STRONG><SPAN>Graphical Mapping: UDFs adapted to use out-of-the-box functions instead of the Dynamic Configuration API.</SPAN></STRONG><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_15-1783354524313.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430089i17E34DEC25C2C54B/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_15-1783354524313.png" alt="hbcordeiro_15-1783354524313.png" /></span></P><P> </P><P><SPAN> </SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hbcordeiro_16-1783354524313.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/430090i0098C553029A504F/image-size/large?v=v2&px=999" role="button" title="hbcordeiro_16-1783354524313.png" alt="hbcordeiro_16-1783354524313.png" /></span></P><P> </P><H2 id="toc-hId-640058398"><SPAN> </SPAN><STRONG><SPAN>Additionally, for XI Adapter, Natively Supports ASMA</SPAN></STRONG><SPAN> </SPAN></H2><P><SPAN>The XI adapter in Cloud Integration natively supports Adapter-Specific Message Attributes. The XI sender adapter automatically creates a pair of exchange properties for each ASMA: one holding the value and one holding the namespace. When configuring ASMAs for the XI receiver adapter, both properties must be explicitly created.</SPAN><SPAN> </SPAN></P><P><SPAN>For scenarios using the XI adapter, the migration of ASMA-based logic can therefore be automated. For other adapter types, a similar approach applies, with the key distinction that the namespace property is typically not required. It is specifically needed by the XI receiver adapter, but not by other adapters.</SPAN><SPAN> </SPAN></P><P><SPAN>In pipeline-based integration approaches this is handled automatically within the generic XI inbound and XI outbound flows. Since exchange properties are not passed between flows, corresponding headers are created at the XI inbound step and then converted back to properties at the XI outbound step.</SPAN><SPAN> </SPAN></P><P><SPAN>For further details, see:</SPAN><SPAN> </SPAN></P><TABLE><TBODY><TR><TD><P><STRONG><SPAN>References</SPAN></STRONG><SPAN> </SPAN></P></TD><TD><P><STRONG><SPAN>Links</SPAN></STRONG><SPAN> </SPAN></P></TD></TR><TR><TD><P><SPAN>Generic Inbound and Outbound</SPAN><SPAN> </SPAN></P></TD><TD><P><A href="https://help.sap.com/docs/migration-guide-po/migration-guide-for-sap-process-orchestration/generic-inbound-and-outbound" target="_blank" rel="noopener noreferrer"><SPAN>Generic Inbound and Outbound | SAP Help Portal</SPAN></A><SPAN> </SPAN></P></TD></TR></TBODY></TABLE><H2 id="toc-hId-443544893"><SPAN> </SPAN></H2><H2 id="toc-hId-247031388"><STRONG><SPAN>Summary</SPAN></STRONG><SPAN> </SPAN></H2><P><SPAN>Migrating integration scenarios that use Dynamic Configuration (ASMA) from SAP Process Orchestration to SAP Integration Suite requires a multi-step approach.</SPAN><SPAN> </SPAN></P><P><SPAN>The recommended migration path combines two capabilities of SAP Integration Suite: Migration Assessment, to identify all affected integration scenarios and quantify ASMA usage through rules such as GMMCustomUDFDynamicConfiguratiom, GMMCustomUDFUsageCount and JAVAMDynamicConfiguration; and the Migration Tool, to semi-automatically generate iFlows from existing SAP PO artifacts.</SPAN><SPAN> </SPAN></P><P><SPAN>However, automated migration alone may not be sufficient. Depending on how Dynamic Configuration was used, each mapping type may requires targeted manual adaptation.</SPAN><SPAN> </SPAN></P><P><SPAN>By combining the structured assessment and tooling capabilities with these targeted adaptations, teams can achieve a controlled, risk-reduced migration from SAP PO/PI to SAP Integration Suite while preserving the intended runtime behavior of each interface.</SPAN><SPAN> </SPAN></P><P><SPAN> </SPAN></P>2026-07-17T11:50:36.016000+02:00https://community.sap.com/t5/integration-blog-posts/how-to-enable-checkboxes-for-configuration-parameters-in-sap-cloud/ba-p/14443155How to Enable Checkboxes for Configuration Parameters in SAP Cloud Integration2026-07-17T17:10:18.492000+02:00Shashi_Bhushan_Kumarhttps://community.sap.com/t5/user/viewprofilepage/user-id/257746<P><STRONG>Introduction:</STRONG></P><P><SPAN>In this blog, I will first demonstrate how to control payload logging using an externalized parameter with </SPAN><CODE><SPAN>true</SPAN></CODE><SPAN>/</SPAN><CODE><SPAN>false</SPAN></CODE><SPAN> values. Then, I will replace the text-based parameter with a checkbox and show how to achieve the same functionality in a more intuitive and user-friendly way.</SPAN></P><P> </P><P><STRONG>Part 1: Using a Text-Based Externalized Parameter to Control Payload Logging</STRONG></P><P>In the example below, I have added a Content Modifier to declare the Exchange Property <CODE>enableLog</CODE>, which will be used to control payload logging. </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_0-1784294699391.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434395i0F14EA7B2C2CCD1B/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_0-1784294699391.png" alt="Shashi_Bhushan_Kumar_0-1784294699391.png" /></span></P><P>The <CODE>enableLog</CODE> parameter has been externalized with a default value of <CODE>true</CODE>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_1-1784294924258.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434396i06009B5613609A44/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_1-1784294924258.png" alt="Shashi_Bhushan_Kumar_1-1784294924258.png" /></span></P><P class=""><SPAN>Next, I use the </SPAN><CODE><SPAN>enableLog</SPAN></CODE><SPAN> parameter in the Groovy script to determine whether the payload should be logged. Based on the configured value (</SPAN><CODE><SPAN>true</SPAN></CODE><SPAN> or </SPAN><CODE><SPAN>false</SPAN></CODE><SPAN>), the script either logs the payload or skips the logging step.</SPAN></P><P><STRONG><SPAN>Important:</SPAN></STRONG><SPAN> Although the externalized parameter is configured with the values </SPAN><CODE><SPAN>true</SPAN></CODE><SPAN> or </SPAN><CODE><SPAN>false</SPAN></CODE><SPAN>, SAP Cloud Integration passes the value to the Groovy script as a </SPAN><STRONG><SPAN>String</SPAN></STRONG><SPAN>, not as a </SPAN><STRONG><SPAN>Boolean</SPAN></STRONG><SPAN>. Therefore, you should explicitly compare the value of </SPAN><CODE><SPAN>enableLog</SPAN></CODE><SPAN> with the string </SPAN><CODE><SPAN>"true"</SPAN></CODE><SPAN> (or </SPAN><CODE><SPAN>"false"</SPAN></CODE><SPAN>). This comparison returns a Boolean result, which can then be used directly in the </SPAN><CODE><SPAN>if</SPAN></CODE><SPAN> condition to control the logging logic.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_2-1784295037229.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434398iF8C7CA17E80073EE/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_2-1784295037229.png" alt="Shashi_Bhushan_Kumar_2-1784295037229.png" /></span></P><P><SPAN>I configured the externalized parameter </SPAN><CODE><SPAN>enableLog</SPAN></CODE><SPAN> with the value </SPAN><CODE><SPAN>true</SPAN></CODE><SPAN>. Since the condition evaluated to </SPAN><CODE><SPAN>true</SPAN></CODE><SPAN>, the Groovy script logged the payload successfully, as shown in the example below.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_3-1784295420830.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434409i3CDD0FD5B775AEFF/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_3-1784295420830.png" alt="Shashi_Bhushan_Kumar_3-1784295420830.png" /></span></P><P><STRONG>Part 2: Using a Checkbox-Based Externalized Parameter to Control Payload Logging</STRONG></P><P class=""><SPAN>To follow along with this example, download the artifacts and extract the ZIP file. After extracting it, navigate to the following directory:</SPAN></P><P class=""><CODE><SPAN>CheckBox\src\main\resources</SPAN></CODE></P><P><SPAN>This folder contains the files that need to be modified to enable checkbox-based externalized parameters.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_0-1784299918589.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434435iE7F8F6435B5B7C81/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_0-1784299918589.png" alt="Shashi_Bhushan_Kumar_0-1784299918589.png" /></span></P><P><SPAN>Modify the parameter type from </SPAN><CODE><STRONG><SPAN>string</SPAN></STRONG></CODE><SPAN> to </SPAN><CODE><STRONG><SPAN>boolean</SPAN></STRONG></CODE><SPAN>, as shown below. This change instructs SAP Cloud Integration to render the externalized parameter as a checkbox instead of a text field.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_1-1784300129747.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434437i5E3D8CE27DDF1697/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_1-1784300129747.png" alt="Shashi_Bhushan_Kumar_1-1784300129747.png" /></span></P><P>Zip the file as below:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_0-1784300580224.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434442i8411950804F41463/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_0-1784300580224.png" alt="Shashi_Bhushan_Kumar_0-1784300580224.png" /></span></P><P>Upload the Zip file as below: </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_1-1784300716833.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434445i552CB63140B7BE3D/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_1-1784300716833.png" alt="Shashi_Bhushan_Kumar_1-1784300716833.png" /></span></P><P>Now you will get the checkbox as below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_2-1784300811236.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434447i4D8CD2E7E8E96543/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_2-1784300811236.png" alt="Shashi_Bhushan_Kumar_2-1784300811236.png" /></span></P><P><STRONG>Conclusion: </STRONG></P><P class=""><SPAN>In this blog, we explored two approaches for controlling payload logging in SAP Cloud Integration using externalized parameters. We first implemented the traditional approach with a text-based parameter that accepts </SPAN><CODE><SPAN>true</SPAN></CODE><SPAN> or </SPAN><CODE><SPAN>false</SPAN></CODE><SPAN> values. We then enhanced the solution by changing the parameter type from </SPAN><STRONG><SPAN>String</SPAN></STRONG><SPAN> to </SPAN><STRONG><SPAN>Boolean</SPAN></STRONG><SPAN>, which automatically renders it as a checkbox in the configuration.</SPAN></P><P><SPAN>Using a checkbox provides a cleaner and more intuitive user experience, eliminating the need to manually enter </SPAN><CODE><SPAN>true</SPAN></CODE><SPAN> or </SPAN><CODE><SPAN>false</SPAN></CODE><SPAN> values and reducing the risk of configuration errors. This simple enhancement can be applied to any Boolean configuration parameter in your integration flows, making them easier to configure and maintain.</SPAN></P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P>2026-07-17T17:10:18.492000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/from-code-to-strategy-how-mcp-cpi-and-lightweight-agents-unlock-ai-driven/ba-p/14443320From Code to Strategy: How MCP, CPI, and Lightweight Agents Unlock AI‑Driven SAP Integrations2026-07-17T17:58:20.038000+02:00dibyajyoti_nandahttps://community.sap.com/t5/user/viewprofilepage/user-id/184938<H3 id="toc-hId-1949111872"><STRONG>Introduction</STRONG></H3><P><SPAN>SAP Cloud Platform Integration (CPI) allows enterprises to connect diverse systems through <STRONG>iFlows</STRONG> — integration flows that define how data moves and transforms between endpoints. By combining CPI with the <STRONG>Model Context Protocol (MCP)</STRONG> and a lightweight <STRONG>Agent</STRONG>, we can expose SAP processes as consumable services — enabling seamless orchestration, automation, and intelligent interaction across enterprise systems.</SPAN></P><DIV> </DIV><H3 id="toc-hId-1752598367"><STRONG>Understanding the Components</STRONG></H3><H4 id="toc-hId-1685167581"><STRONG>SAP Cloud Platform Integration (CPI)</STRONG></H4><P><SPAN>SAP CPI is the <STRONG>integration backbone</STRONG> of the SAP ecosystem. It enables secure, scalable, and real-time data exchange between SAP and non-SAP systems. In this architecture, CPI acts as the <STRONG>execution layer</STRONG>, where business logic resides. The iFlow processes requests coming from the MCP Server, performs necessary transformations, and interacts with SAP backend systems such as <STRONG>S/4HANA</STRONG>, <STRONG>SuccessFactors</STRONG>, or <STRONG>Finance</STRONG> modules.</SPAN></P><P><SPAN><STRONG>In the AI world:</STRONG> CPI provides the <STRONG>structured data foundation</STRONG> that intelligent agents rely on. By exposing iFlows as APIs, it allows AI systems to access enterprise data securely and contextually — bridging traditional ERP with modern AI-driven automation.</SPAN></P><DIV> </DIV><H4 id="toc-hId-1488654076"><STRONG>Model Context Protocol (MCP) Server</STRONG></H4><P><SPAN>The MCP Server is the <STRONG>middleware bridge</STRONG> between the Agent and SAP CPI. It defines “tools” — essentially API endpoints — that the Agent can call to trigger specific SAP processes. It handles authentication, routing, and error management, ensuring that requests from the Agent are properly formatted and securely transmitted to CPI.</SPAN></P><P><SPAN><STRONG>In the AI world:</STRONG> MCP acts as the <STRONG>contextual translator</STRONG> between natural language and enterprise APIs. It enables AI agents to understand what business functions are available and how to invoke them, making enterprise systems conversational and intelligent.</SPAN></P><DIV> </DIV><H4 id="toc-hId-1292140571"><STRONG>Copilot Agent</STRONG></H4><P><SPAN>The Agent is the <STRONG>frontline interface</STRONG> — a lightweight application (built with FastAPI or similar frameworks) that interacts with users or other systems. It consumes the MCP tools and provides a simple way to trigger SAP processes, either through a web UI or API calls.</SPAN></P><P><SPAN><STRONG>In the AI world:</STRONG> The Agent represents the <STRONG>intelligence layer</STRONG> — capable of interpreting user intent, orchestrating workflows, and connecting to enterprise data through MCP and CPI. It’s the component that transforms static APIs into dynamic, AI-driven interactions.</SPAN></P><DIV> </DIV><H3 id="toc-hId-966544347"><STRONG>Key Steps</STRONG></H3><H4 id="toc-hId-899113561"><STRONG>1. Expose the iFlow in SAP CPI</STRONG></H4><UL><LI><P><SPAN>Design and deploy your iFlow (e.g., invoice retrieval or employee data).</SPAN></P></LI><LI><P><SPAN>Ensure it’s accessible via HTTPS with proper authentication.</SPAN></P></LI></UL><H4 id="toc-hId-702600056"><STRONG>2. Create the MCP Server</STRONG></H4><UL><LI><P><SPAN>Define tools mapping to CPI endpoints.</SPAN></P></LI><LI><P><SPAN>Configure the MCP server to expose these tools securely.</SPAN></P></LI><LI><P><SPAN>Example endpoint: <CODE><A href="http://localhost:8000/tools/sayHello" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/tools/sayHello</A></CODE></SPAN></P></LI></UL><H4 id="toc-hId-506086551"><STRONG>3. Consume with an Agent</STRONG></H4><UL><LI><P><SPAN>Build a lightweight Agent using FastAPI.</SPAN></P></LI><LI><P><SPAN>Connect it to the MCP server and expose an endpoint like <CODE><A href="http://localhost:9000/agent/sayHello" target="_blank" rel="noopener nofollow noreferrer">http://localhost:9000/agent/sayHello</A></CODE>.</SPAN></P></LI><LI><P><SPAN>Provide a simple UI for users to trigger CPI processes.</SPAN></P></LI></UL><DIV> </DIV><H3 id="toc-hId-180490327"><STRONG>Tools Used</STRONG></H3><UL><LI><P><SPAN><STRONG>SAP CPI</STRONG> → iFlow design and deployment</SPAN></P></LI><LI><P><SPAN><STRONG>MCP Server</STRONG> → Tool definition and orchestration</SPAN></P></LI><LI><P><SPAN><STRONG>FastAPI</STRONG> → Agent development</SPAN></P></LI><LI><P><SPAN><STRONG>OAuth2 / SAP IAS</STRONG> → Authentication and security</SPAN></P></LI></UL><DIV> </DIV><H3 id="toc-hId--91254547"><STRONG>Architecture Overview</STRONG></H3><P><SPAN>Embed your architecture diagram here showing the flow: <STRONG>User → Copilot Agent → MCP Server → SAP CPI → SAP Backend Systems</STRONG></SPAN></P><BLOCKQUOTE><P><SPAN><EM>Figure 1: End-to-end architecture connecting the Agent, MCP Server, and SAP CPI iFlow.</EM></SPAN></P></BLOCKQUOTE><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_4-1784294611769.png" style="width: 490px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434394iA5303BFED911F2CA/image-dimensions/490x327?v=v2" width="490" height="327" role="button" title="dibyajyoti_nanda_4-1784294611769.png" alt="dibyajyoti_nanda_4-1784294611769.png" /></span><H3 id="toc-hId--287768052"><STRONG>Step: Create a Simple iFlow in SAP CPI</STRONG></H3><P><SPAN>Design a basic iFlow in <STRONG>SAP Cloud Platform Integration (CPI)</STRONG> that accepts a name as input payload and returns a greeting message. For example, if the payload contains <CODE>"Dibyajyoti"</CODE>, the iFlow should respond with <CODE>"Hello Dibyajyoti"</CODE>.</SPAN></P><P><SPAN>Once the development is complete, <STRONG>deploy the iFlow</STRONG> to generate the endpoint URL. This URL will be used later by the MCP Server and Copilot Agent to invoke the iFlow and integrate it into the overall architecture.</SPAN></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_5-1784295101195.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434402i90A5EE7E6B434C10/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_5-1784295101195.png" alt="dibyajyoti_nanda_5-1784295101195.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_6-1784295120142.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434403iAB4E8A144462FEB0/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_6-1784295120142.png" alt="dibyajyoti_nanda_6-1784295120142.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_7-1784295136670.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434404iAEC61509E632E8AF/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_7-1784295136670.png" alt="dibyajyoti_nanda_7-1784295136670.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_8-1784295234623.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434405iE7C313C390079338/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_8-1784295234623.png" alt="dibyajyoti_nanda_8-1784295234623.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_9-1784295250406.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434406iFB38F890953214D3/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_9-1784295250406.png" alt="dibyajyoti_nanda_9-1784295250406.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_10-1784295397082.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434408i5C54642D897DF8E5/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_10-1784295397082.png" alt="dibyajyoti_nanda_10-1784295397082.png" /></span><P><EM><STRONG>"<A target="_blank" rel="noopener">https://<SUBACCOUNT>.it-cpitrial06-rt.cfapps.us10-001.hana.ondemand.com/http/hello</A>"</STRONG></EM></P><H3 id="toc-hId--484281557"><STRONG>Step 2: Test the iFlow Endpoint in Postman</STRONG></H3><P><SPAN>Once the iFlow is deployed in <STRONG>SAP CPI</STRONG>, you’ll receive an endpoint URL. To validate it, use <STRONG>Postman</STRONG>:</SPAN></P><OL><LI><P><SPAN><STRONG>Open Postman</STRONG> and create a new request.</SPAN></P></LI><LI><P><SPAN><STRONG>Set the method</STRONG> to <CODE>POST</CODE> (or <CODE>GET</CODE>, depending on your iFlow design).</SPAN></P></LI><LI><P><SPAN><STRONG>Enter the endpoint URL</STRONG> generated during deployment (e.g., <CODE><A href="https://cpi.example.com/http/endpoint/sayHello" target="_blank" rel="noopener nofollow noreferrer">https://cpi.example.com/http/endpoint/sayHello</A></CODE>).</SPAN></P></LI><LI><P><SPAN><STRONG>Authentication:</STRONG></SPAN></P><UL><LI><P><SPAN><STRONG>Username</STRONG> → <EM>Client ID</EM></SPAN></P></LI><LI><P><SPAN><STRONG>Password</STRONG> → <EM>Client Secret</EM> These credentials are provided when you configure the CPI tenant and are required for secure access.</SPAN></P></LI></UL></LI><LI><P><SPAN><STRONG>Payload:</STRONG></SPAN></P><UL><LI><P><SPAN>In the request body, pass the input JSON or text payload (e.g., <CODE>{ "name": "Dibyajyoti" }</CODE>).</SPAN></P></LI></UL></LI><LI><P><SPAN><STRONG>Send the request</STRONG> and verify the response.</SPAN></P><UL><LI><P><SPAN>Expected output: <CODE>Hello Dibyajyoti</CODE></SPAN></P></LI></UL></LI></OL><DIV> </DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_11-1784299427248.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434424i64731458EA637742/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_11-1784299427248.png" alt="dibyajyoti_nanda_11-1784299427248.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_12-1784299487199.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434426i601582FD395FCE7A/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_12-1784299487199.png" alt="dibyajyoti_nanda_12-1784299487199.png" /></span><H3 id="toc-hId--680795062"><STRONG>Step 3: Set Up the MCP Environment</STRONG></H3><P><SPAN>Before working with the <STRONG>MCP Server</STRONG>, ensure your development environment is ready. You’ll need the following installed on your system:</SPAN></P><UL><LI><P><SPAN><STRONG>Python</STRONG> (version 3.9 or above recommended)</SPAN></P></LI><LI><P><SPAN><STRONG>PIP</STRONG> (Python package manager)</SPAN></P></LI><LI><P><SPAN><STRONG>Visual Studio Code</STRONG> (for editing and running your project)</SPAN></P></LI></UL><SPAN><BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_13-1784299722448.png" style="width: 605px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434429iDF254624CB2A7562/image-dimensions/605x62?v=v2" width="605" height="62" role="button" title="dibyajyoti_nanda_13-1784299722448.png" alt="dibyajyoti_nanda_13-1784299722448.png" /></span><H3 id="toc-hId--877308567"><STRONG>Step 4: Create the Project Folder Structure</STRONG></H3><P><SPAN>To organize your MCP setup, create the following folders:</SPAN></P><OL><LI><P><SPAN><STRONG>Main Project Folder</STRONG></SPAN></P><UL><LI><P><SPAN>Name: <CODE>MCPPROJECT</CODE></SPAN></P></LI></UL></LI><LI><P><SPAN><STRONG>Subfolders inside MCPPROJECT</STRONG></SPAN></P><UL><LI><P><SPAN><CODE>SAP_MCP_SERVER</CODE> → Contains the MCP Server files (<CODE>server.py</CODE>, <CODE>.env</CODE>, <CODE>requirements.txt</CODE>)</SPAN></P></LI><LI><P><SPAN><CODE>COPILOT_AGENT</CODE> → Contains the Agent files (<CODE>agent.py</CODE>, <CODE>templates/index.html</CODE>, <CODE>requirements.txt</CODE>)</SPAN></P></LI></UL></LI></OL><DIV> </DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_14-1784299918697.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434434iCC4D380C523F4F19/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_14-1784299918697.png" alt="dibyajyoti_nanda_14-1784299918697.png" /></span><P>SAP_MCP_SERVER</P><P>.env----></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_15-1784300103035.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434436iC88E70775838E1F6/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_15-1784300103035.png" alt="dibyajyoti_nanda_15-1784300103035.png" /></span><P>requirements.txt----></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_16-1784300159824.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434438iE1F49CC6A1687674/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_16-1784300159824.png" alt="dibyajyoti_nanda_16-1784300159824.png" /></span><P>server.py----></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_17-1784300241832.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434439iBFBBD07060649912/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_17-1784300241832.png" alt="dibyajyoti_nanda_17-1784300241832.png" /></span><P>COPILOT_AGENT</P><P>requirements.txt------></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_18-1784300469320.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434440i22E5E786FC517075/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_18-1784300469320.png" alt="dibyajyoti_nanda_18-1784300469320.png" /></span><P>agent.py-------></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_19-1784300534035.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434441iA29826F9DBDEE34C/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_19-1784300534035.png" alt="dibyajyoti_nanda_19-1784300534035.png" /></span><P>create a subfolder</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_20-1784300619452.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434443i2828BB8EF9658A07/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_20-1784300619452.png" alt="dibyajyoti_nanda_20-1784300619452.png" /></span><P>index.html---------></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_21-1784300688972.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434444iBFE833D14856B85F/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_21-1784300688972.png" alt="dibyajyoti_nanda_21-1784300688972.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_22-1784300730982.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434446i5262693F41DF3032/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_22-1784300730982.png" alt="dibyajyoti_nanda_22-1784300730982.png" /></span><P> </P><H3 id="toc-hId--1073822072"><STRONG>Step 5: Run the MCP Server and Copilot Agent</STRONG></H3><H4 id="toc-hId--1563738584"><STRONG>Inside </STRONG><CODE>sap_mcp_server</CODE></H4><P><SPAN>Install dependencies and start the MCP Server:</SPAN></P></DIV><pre class="lia-code-sample language-bash"><code>pip install -r requirements.txt
uvicorn server:app --reload --port 8000</code></pre><P> </P><UL><LI><P><SPAN><CODE>pip install -r requirements.txt</CODE> → Installs all required Python packages.</SPAN></P></LI><LI><P><SPAN><CODE>uvicorn server:app --reload --port 8000</CODE> → Launches the MCP Server on port <STRONG>8000</STRONG> with auto-reload enabled.</SPAN></P></LI></UL><H4 id="toc-hId--1760252089"><STRONG>Inside </STRONG><CODE>copilot_agent</CODE></H4><P><SPAN>Install dependencies and start the Copilot Agent:</SPAN></P><pre class="lia-code-sample language-bash"><code>pip install -r requirements.txt
uvicorn agent:app --reload --port 9000
</code></pre><P> </P><UL><LI><P><SPAN><CODE>pip install -r requirements.txt</CODE> → Installs Agent dependencies.</SPAN></P></LI><LI><P><SPAN><CODE>uvicorn agent:app --reload --port 9000</CODE> → Launches the Agent on port <STRONG>9000</STRONG> with auto-reload enabled.</SPAN></P></LI></UL><H4 id="toc-hId--1956765594"><STRONG>Test the Agent</STRONG></H4><P><SPAN>Once both services are running, open the Agent URL in your browser:</SPAN></P><pre class="lia-code-sample language-markup"><code>http://localhost:9000/</code></pre><P> This will load the Agent’s web interface, allowing you to trigger the MCP tools and ultimately invoke the SAP CPI iFlow.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_23-1784301717047.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434452i1F3CE18849D4B984/image-size/medium?v=v2&px=400" role="button" title="dibyajyoti_nanda_23-1784301717047.png" alt="dibyajyoti_nanda_23-1784301717047.png" /></span></P><H3 id="toc-hId--1859876092"><STRONG>Conclusion</STRONG></H3><P><SPAN>By exposing SAP CPI iFlows through an MCP Server and consuming them with an Agent, enterprises can create a <STRONG>modular, API-driven integration layer</STRONG>. This approach simplifies access to SAP processes, improves reusability, and lays the foundation for <STRONG>AI-powered enterprise automation</STRONG> — where intelligent agents can interact with SAP systems naturally, securely, and efficiently.</SPAN></P><P>Regards,</P><P>Dibyajyoti Nanda</P><P><A href="https://www.linkedin.com/in/dibyajyoti-nanda-23907429/" target="_blank" rel="nofollow noopener noreferrer">https://www.linkedin.com/in/dibyajyoti-nanda-23907429/</A></P><P> </P>2026-07-17T17:58:20.038000+02:00https://community.sap.com/t5/integration-blog-posts/implementing-dual-schedulers-in-a-single-sap-integration-suite-iflow/ba-p/14443414Implementing Dual Schedulers in a Single SAP Integration Suite iFlow: Supporting Ad Hoc and Schedule2026-07-17T20:05:32.106000+02:00Shashi_Bhushan_Kumarhttps://community.sap.com/t5/user/viewprofilepage/user-id/257746<P>Recently, SAP Cloud Integration (CPI) introduced support for <STRONG>multiple Integration Processes in a single iFlow</STRONG>, enabling scenarios like separate <STRONG>scheduled</STRONG> and <STRONG>ad hoc</STRONG> execution paths.</P><P><SPAN>The iFlow below uses </SPAN><STRONG><SPAN>two schedulers</SPAN></STRONG><SPAN>. The </SPAN><STRONG><SPAN>first scheduler</SPAN></STRONG><SPAN> is dedicated to </SPAN><STRONG><SPAN>ad hoc execution</SPAN></STRONG><SPAN>, while the </SPAN><STRONG><SPAN>second scheduler</SPAN></STRONG><SPAN> handles the </SPAN><STRONG><SPAN>regular scheduled execution</SPAN></STRONG><SPAN>.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_0-1784304787352.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434459iE063C32BDD5652EF/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_0-1784304787352.png" alt="Shashi_Bhushan_Kumar_0-1784304787352.png" /></span></P><P class=""><STRONG><SPAN>Case 1: Normal Schedule</SPAN></STRONG></P><P><SPAN>The iFlow runs as per the configured schedule using the regular scheduler.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_0-1784309972881.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434477i1B5EFF1EEEDEB683/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_0-1784309972881.png" alt="Shashi_Bhushan_Kumar_0-1784309972881.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_1-1784310050833.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434479i7DEE1A627B67B2AE/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_1-1784310050833.png" alt="Shashi_Bhushan_Kumar_1-1784310050833.png" /></span></P><P> </P><P class=""><STRONG><SPAN>Case 2: Ad Hoc Run and Automatic Switch Back to Normal Schedule</SPAN></STRONG></P><P><SPAN>The iFlow can be triggered for an ad hoc run without modifying the regular scheduler. After the ad hoc execution is completed, the iFlow continues with the normal scheduled run automatically. Ad hoc run happen at 9.12. and as you can see it automatically trgerring every 5 min.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shashi_Bhushan_Kumar_2-1784311443035.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434482i7D119E8423449703/image-size/medium?v=v2&px=400" role="button" title="Shashi_Bhushan_Kumar_2-1784311443035.png" alt="Shashi_Bhushan_Kumar_2-1784311443035.png" /></span></P><P> </P><P> </P><P class=""><STRONG><SPAN>Conclusion</SPAN></STRONG></P><P><SPAN>Using two schedulers in a single SAP CPI iFlow provides a reliable way to handle both ad hoc and scheduled executions. It eliminates manual scheduler changes, reduces operational risks, and ensures that regular scheduled processing continues without interruption.</SPAN></P><P> </P><P> </P><P> </P><P> </P>2026-07-17T20:05:32.106000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/integration-suite-building-an-mcp-server-for-a-sap-ci-monitoring-assistant/ba-p/14442685Integration Suite: Building an MCP Server for a SAP CI Monitoring Assistant2026-07-17T20:13:23.354000+02:00Daggolu_PremSaihttps://community.sap.com/t5/user/viewprofilepage/user-id/1668154<H2 id="toc-hId-1820002436">Introduction</H2><P>In SAP Integration Suite, Message Processing Logs (MPL) are the primary tool for monitoring and troubleshooting interfaces. Whenever something fails, the same routine follows: log into the tenant, open Monitor, filter by artifact, drill into the failed message, read the error. In my previous blogs I looked at ways to make this easier — automating email alerts for failed interfaces, logging custom header properties for better MPL search, and storing logs in Database for long-term retention.</P><P>Now we are taking it a step further. SAP recently released the <STRONG>MCP Server</STRONG> capability in Integration Suite, which lets you expose any API as a set of tools that an AI agent can discover and call at runtime. So instead of clicking through the Monitor, you can simply ask an assistant in natural language — <EM>"show me all failed messages in the last 2 hours"</EM> or <EM>"why did the XYZ interface fail?"</EM> — and let it query the tenant for you.</P><P>In this blog we will build a <STRONG>CI Monitoring Assistant</STRONG>: a generic, reusable MCP Server that sits on top of the SAP Cloud Integration OData API and can be consumed from any MCP-compatible client such as VS Code or Claude Desktop.</P><H2 id="toc-hId-1623488931">What is MCP?</H2><P>Model Context Protocol (MCP) is an open standard that lets AI agents discover and invoke tools at runtime. You publish an MCP Server — a runtime endpoint that advertises a list of named, described tools — and the agent reads those descriptions to decide what to call and how. No hardcoding of API calls into the agent.</P><H2 id="toc-hId-1426975426">The problem we are solving</H2><P>Standard MPL monitoring works, but it is entirely manual and click-driven. For operations teams this means:</P><UL><LI>Every check requires logging into the tenant and navigating the Monitor.</LI><LI>Correlating a failure across artifacts, error text and custom headers takes several drill-downs.</LI><LI>There is no easy way to ask a plain-language question and get a consolidated answer.</LI></UL><P>The SAP API Hub provides the OpenAPI JSON API specification for the SAP Cloud Integration OData API (MessageProcessingLogs). We retrieve that specification from SAP API Hub and convert it into OpenAPI 3.0 <EM>(converted using AI)</EM> so it can be used consistently by downstream tools and agents. The MCP Server then exposes the resulting read operations as tools, making monitoring conversational instead of manual.</P><H2 id="toc-hId-1230461921">Prerequisites</H2><P>Before we start, make sure the following are in place:</P><UL><LI><STRONG>Cloud Integration</STRONG> and <STRONG>API Management</STRONG> capabilities activated in Integration Suite.</LI><LI>The <STRONG>Integration Cell</STRONG> runtime enabled — go to <STRONG>Settings → Runtimes</STRONG> and confirm it shows <EM>Active</EM>. The MCP Server artifact runs on Integration Cell; it cannot be deployed to the classic Cloud Integration runtime.<UL class="lia-list-style-type-square"><LI><EM>MCP is available only in premium and enhanced edition plans, and in trial account</EM>s.</LI></UL></LI><LI>The <CODE>PI_Integration_Developer</CODE> role collection assigned to your user in the BTP Cockpit.</LI></UL><BLOCKQUOTE><P>If any capability or runtime is missing, activate it first — the MCP Server option will not appear until Integration Cell is running.</P></BLOCKQUOTE><H2 id="toc-hId-1033948416">Solution overview</H2><P>At a high level, the flow looks like this:</P><PRE><CODE>VS Code / Claude Desktop (MCP client)
| MCP protocol
v
MCP Server artifact (Integration Cell)
| HTTPS + CI OAuth
v
CI OData API (MessageProcessingLogs)
|
v
Your SAP Cloud Integration tenant</CODE></PRE><P>The MCP Server is created from an <STRONG>HTTP Endpoint with an OpenAPI 3.0 specification</STRONG>. We import the OpenAPI JSON that describes the monitoring operations, choose which operations become tools, add prompts and resources, configure the HTTPS adapter to authenticate to CI using OAuth, and deploy. The client then connects using a runtime service key.</P><H2 id="toc-hId-837434911">Step-by-step guide</H2><H3 id="toc-hId-770004125">Step 1 – Enable the required capabilities</H3><P>Activate Cloud Integration, API Management, and the Integration Cell runtime. Confirm under <STRONG>Settings → Runtimes</STRONG> that Integration Cell shows <EM>Active</EM>. This is the single most common blocker — the MCP Server artifact type will not be selectable otherwise.</P><H3 id="toc-hId-573490620">Step 2 – Prepare the OpenAPI 3.0 JSON</H3><P>The MCP Server needs an OpenAPI 3.0 specification. Each <CODE>operationId</CODE> in the spec becomes a tool name the agent can discover, and each <CODE>description</CODE> is what the agent reads to decide <EM>when</EM> and <EM>how</EM> to use the tool — so write the descriptions for the agent.</P><P>download - <A href="https://github.com/premsaidaggolu/blog-resources/blob/main/mcp-ci-message-processing-logs-openapi-3.0.json" target="_blank" rel="noopener nofollow noreferrer">mcp-ci-message-processing-logs-openapi-3.0.json</A></P><H3 id="toc-hId-376977115">Step 3 – Create the MCP Server artifact</H3><P>Go to an existing or new Integration Package and <STRONG>create a new artifact of type: MCP Server</STRONG>. When prompted for the source type, choose <STRONG>HTTP Endpoint with OpenAPI Specification</STRONG> and <STRONG>upload the OpenAPI 3.0 JSON</STRONG> file you downloaded in Step 2. The wizard imports the spec and generates a list of tools from your operations.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Daggolu_PremSai_1-1784269372956.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434128i387A9FC754E7AE2B/image-size/large?v=v2&px=999" role="button" title="Daggolu_PremSai_1-1784269372956.png" alt="Daggolu_PremSai_1-1784269372956.png" /></span></P><H3 id="toc-hId-180463610">Step 4 – Select tools, resources and prompts</H3><UL><LI><STRONG>Tools</STRONG> – select the operations you want to expose. Review the generated tool name and description for each; refine descriptions so the agent understands intent. (Max 15 tools can be selected per MCP Artifact)</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Daggolu_PremSai_5-1784292498277.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434375iB59CEA6D75C58B9E/image-size/large?v=v2&px=999" role="button" title="Daggolu_PremSai_5-1784292498277.png" alt="Daggolu_PremSai_5-1784292498277.png" /></span></P><UL><LI><STRONG>Resources</STRONG> – add any static reference content the agent may need (for example, a list of interface names or a status-code cheat sheet). This is optional but improves answer quality.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Daggolu_PremSai_4-1784292456872.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434374iAF21FC9BC89A517A/image-size/large?v=v2&px=999" role="button" title="Daggolu_PremSai_4-1784292456872.png" alt="Daggolu_PremSai_4-1784292456872.png" /></span></P><UL><LI><STRONG>Prompts</STRONG> – provide reusable prompt templates, e.g. <EM>"Summarise all failures in the last 2 hours grouped by interface."</EM> These give end users a guided starting point.</LI></UL><H3 id="toc-hId--91281264">Step 5 – Create two runtime service keys (CI OData API + MCP Client Auth)</H3><P class="">This solution needs <STRONG>two separate OAuth credentials</STRONG>, because two different calls happen and they use different Process Integration Runtime service plans:</P><UL class=""><LI><STRONG>CI OData Monitoring API</STRONG> (plan <CODE>api</CODE>) → used inside the MCP Server by the HTTPS receiver adapter to read Message Processing Logs.</LI><LI><STRONG>MCP Client Authentication</STRONG> (plan <CODE>integration-flow</CODE>) → used by the AI client (VS Code / Claude Desktop) to authenticate to the deployed MCP Server endpoint.</LI></UL><P class="">Both are created from the <STRONG>Process Integration Runtime</STRONG> service in your BTP subaccount.</P><H4 id="toc-hId--581197776">5a. Service key for the CI OData Monitoring API (plan: <CODE>api</CODE>)</H4><P class="">This is the credential the HTTPS adapter uses in Step 6 to read monitoring data.</P><OL class=""><LI>In your BTP subaccount, go to <STRONG>Instances and Subscriptions → Create</STRONG>.</LI><LI>Select service <STRONG>Process Integration Runtime</STRONG>, plan <STRONG><CODE>api</CODE> </STRONG>and give the instance a name (e.g. <CODE>it-rt-api-odata</CODE>).</LI><LI>On the <STRONG>Parameters</STRONG> step, add the monitoring-read role — <STRONG><CODE>MonitorDataRead</CODE></STRONG> (this grants read access to Message Processing Logs and related monitoring entities). Keep the grant type as <STRONG>Client Credentials </STRONG>and create it.</LI><LI>On that instance, <STRONG>create a service key</STRONG> (e.g. <CODE>it-rt-api-key-odata</CODE>).</LI><LI>From the service key, copy <CODE>clientid</CODE>, <CODE>clientsecret</CODE>, <CODE>tokenurl</CODE> (and the API <CODE>url</CODE>/host). These go into the <STRONG>Security Material</STRONG> referenced by the HTTPS adapter in Step 6.</LI></OL><BLOCKQUOTE><P class="">Use only <CODE>MonitorDataRead</CODE> here — the assistant is read-only, so there is no reason to grant write or admin roles to the credential that reaches your monitoring data.</P></BLOCKQUOTE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Daggolu_PremSai_0-1784291006846.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434353i7942495376243CB9/image-size/large?v=v2&px=999" role="button" title="Daggolu_PremSai_0-1784291006846.png" alt="Daggolu_PremSai_0-1784291006846.png" /></span></P><H4 id="toc-hId--777711281">5b. Service key for MCP client authentication (plan: <CODE>integration-flow</CODE>)</H4><P class="">This is the credential the AI client uses in Step 8 to call the deployed MCP Server endpoint on Integration Cell.</P><OL class=""><LI>In your BTP subaccount, go to <STRONG>Instances and Subscriptions → Create</STRONG>.</LI><LI>Select service <STRONG>Process Integration Runtime</STRONG>, plan <STRONG><CODE>integration-flow</CODE> </STRONG>and give the instance a name (e.g. <CODE>it-rt-iflow-mcp</CODE>).</LI><LI>On the <STRONG>Parameters</STRONG> step, add the role <STRONG><CODE>API.invoke</CODE></STRONG> (required to invoke the deployed MCP endpoint). Keep the grant type as <STRONG>Client Credentials</STRONG> and create it.</LI><LI>On that instance, <STRONG>create a service key</STRONG> (e.g. <CODE>it-rt-iflow-key-mcp</CODE>).</LI><LI>From the service key, copy <CODE>clientid</CODE>, <CODE>clientsecret</CODE> and <CODE>tokenurl</CODE> . These are the credentials you enter in the MCP client (VS Code / Claude Desktop) to obtain an access token and call the MCP Server.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Daggolu_PremSai_1-1784291054256.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434355iD8E5409D00290429/image-size/large?v=v2&px=999" role="button" title="Daggolu_PremSai_1-1784291054256.png" alt="Daggolu_PremSai_1-1784291054256.png" /></span></P><H3 id="toc-hId--680821779">Step 6 – Configure the HTTPS adapter with CI OAuth</H3><P class="">This is the authentication link between the MCP Server and the CI OData Monitoring API. Here you deploy the OAuth credential you created in <STRONG>Step 5a</STRONG> as a Security Material, then reference it in the HTTP receiver adapter of the MCP Server.</P><P class=""><STRONG>1. Deploy the Step 5a credentials as a Security Material - </STRONG>In Integration Suite, go to <STRONG>Monitor → Integrations and APIs → Manage Security → Security Material → Create → OAuth2 Client Credentials</STRONG>. Fill in the values from your <STRONG>Step 5a</STRONG> service key. Save and <STRONG>deploy</STRONG> it. This keeps the CI credentials inside Integration Suite, away from the agent.</P><P><STRONG>2. Update the HTTP receiver adapter in the MCP Server -</STRONG> Open the MCP Server artifact and edit the HTTP receiver connection that points to the CI OData Monitoring API:</P><UL class=""><LI>Set <STRONG>Authentication</STRONG> to <STRONG>OAuth2 Client Credentials</STRONG>.</LI><LI>In <STRONG>Credential Name</STRONG>, select the Security Material you just deployed.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Daggolu_PremSai_2-1784291799179.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434365iE54F6F9CE3D53D4A/image-size/large?v=v2&px=999" role="button" title="Daggolu_PremSai_2-1784291799179.png" alt="Daggolu_PremSai_2-1784291799179.png" /></span></P><P class="">Save the changes. The MCP Server will now use the Step 5a OAuth credential to authenticate every call it forwards to the CI Monitoring API.</P><H3 id="toc-hId--877335284">Step 7 – Deploy the MCP Server</H3><P>Once tools, resources, prompts and authentication are configured, <STRONG>deploy</STRONG> the artifact. Deployment provisions the runtime endpoint on Integration Cell and makes the tools available for discovery. Wait for the status to show as deployed/active. Note down the <STRONG>MCP Server endpoint URL</STRONG> — the MCP path must be unique.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Daggolu_PremSai_0-1784304969134.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434461iA645631731E5B9F0/image-size/large?v=v2&px=999" role="button" title="Daggolu_PremSai_0-1784304969134.png" alt="Daggolu_PremSai_0-1784304969134.png" /></span></P><H3 id="toc-hId--1073848789">Step 8 – Test with MCP Client (VS Code / Claude Desktop)</H3><P class="">Now connect an MCP client. You need two things:</P><UL class=""><LI><STRONG>MCP Server URL</STRONG> – the endpoint of your deployed MCP Server. Get it from <STRONG>Monitor → Manage Integration Content</STRONG> on the <STRONG>Integration Cell runtime</STRONG>: open the deployed MCP Server artifact and copy its endpoint URL.</LI><LI><STRONG>Authentication</STRONG> – the OAuth credentials from your <STRONG>Step 5b</STRONG> service key: <CODE>clientid</CODE>, <CODE>clientsecret</CODE> and <CODE>tokenurl</CODE>.</LI></UL><P><STRONG>Add these to your MCP client configuration:</STRONG></P><P><STRONG>Claude Desktop</STRONG> – add the MCP Server to the configuration file with the endpoint URL and the Step 5b OAuth credentials (client ID, client secret, token URL). Restart Claude Desktop; the tools should appear as available</P><P><STRONG>VS Code</STRONG> – add the MCP Server in your MCP settings (or your extension's config), pointing to the same endpoint URL and Step 5b credentials.</P><P>Once connected, the client fetches a token from the token URL using the client Id and secret, then uses it to call the MCP Server. The server discovers your tools, and you can start asking questions in natural language:</P><UL><LI><EM>"List all failed messages in the last 2 hours."</EM></LI><LI><EM>"Show the error details for the last failure of the OrderToCash interface."</EM></LI><LI><EM>"Find messages where the PO number custom header equals 4500001234."</EM></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Daggolu_PremSai_0-1784303777772.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434455iB344367A58A97221/image-size/large?v=v2&px=999" role="button" title="Daggolu_PremSai_0-1784303777772.png" alt="Daggolu_PremSai_0-1784303777772.png" /></span></P><P>The agent picks the right tool, calls the MCP Server, which forwards the request to the CI Monitoring API using the OAuth credentials, and returns a consolidated answer — no clicking through the Monitor.</P><H2 id="toc-hId--976959287">Future Enhancements</H2><UL><LI><STRONG>Extend to more OData APIs</STRONG> – The <A href="https://hub.sap.com/package/CloudIntegrationAPI/odata" target="_blank" rel="noopener noreferrer">Cloud Integration OData API</A> exposes far more than Message Processing Logs. Using the exact same steps in this blog, you can build multiple MCP Servers — each wrapping a different API — to create, deploy, undeploy, update, or delete artifacts, parameters, and security materials conversationally.</LI><LI><STRONG>Govern write access carefully</STRONG> – This MCP server is deliberately read-only. The moment you expose write operations the agent can change your tenant, so grant each service key only the minimum role, keep it off production first, and add human confirmation before any destructive action.</LI><LI><STRONG>No rate limiting or payload protection</STRONG> is added in this basic setup. For production, put the API Artifact / MCP Gateway governance layer in front (rate limiting, audit logging, IP blocking).</LI><LI><STRONG>Move to the SAP MCP Hub</STRONG> – SAP is building a centralized, no-code <STRONG>MCP Hub</STRONG> <A title=" SAP BTP AI Best Practices – MCP" href="https://btp-ai-bp.docs.sap/docs/technical-view/agentic-ai/mcp" target="_blank" rel="noopener nofollow noreferrer">(announced Q4 2025, planned GA in H1 2026)</A> that removes the need for each team to build and maintain its own MCP Servers. It handles cross-cutting concerns like security, authorization, observability, and protocol versioning centrally, and adds no-code OData/OpenAPI-to-MCP conversion, modular servers that combine tools from multiple APIs, destination-based connectivity, AI-assisted tool optimization, built-in validation, and a test chat. Once available, migrating this assistant to the MCP Hub is the natural next step.</LI><LI>MCP on Integration Suite is a <STRONG>new capability</STRONG> and is evolving quickly; screens and options may differ slightly from what you see when you try it. Check the SAP Help Portal (<A href="https://help.sap.com/docs/integration-suite/isuite-integrations-and-apis/design-apis" target="_blank" rel="noopener noreferrer"><EM>Design APIs and MCP Servers</EM></A>) for the latest.</LI></UL><P>This blog provides a basic, reusable foundation. You can enhance the MCP Server based on your own requirements — more tools, tighter filters, governance policies, or write-back operations behind proper approval.</P><H2 id="toc-hId--1173472792">Reference</H2><UL><LI><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/one-blog-two-strategic-topics-api-centric-integration-and-mcp-gateway/ba-p/14441975" target="_self">One Blog, Two Strategic Topics: API-Centric Integration and MCP Gateway</A></LI></UL><H2 id="toc-hId--1369986297">Conclusion</H2><P>The MCP Server capability turns SAP Integration Suite monitoring from a manual, click-driven task into a conversational one. By exposing the CI OData Monitoring API as a small set of well-described tools, any MCP-compatible client — VS Code, Claude Desktop, or others — becomes a CI Monitoring Assistant that operations teams can query in plain language.</P><P>If you see scope for enhancement in the tool set or the OpenAPI spec, feel free to drop a comment. I would love to hear how you extend it.</P><P>Happy Integrating!</P>2026-07-17T20:13:23.354000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/configuring-aws-adapter-authentication-assumerole-assumerolewithwebidentity/ba-p/14427839Configuring AWS Adapter Authentication: AssumeRole, AssumeRoleWithWebIdentity and IAMRolesAnywhere2026-07-20T09:05:33.364000+02:00_Irfan_Khanhttps://community.sap.com/t5/user/viewprofilepage/user-id/1451654<P class=""><SPAN>When integrating AWS with SAP Cloud Integration, AWS Security Token Service (STS) enables the use of temporary security credentials associated with IAM roles. This approach reduces the risks associated with long-lived access keys and improves both the security and manageability of authentication.<BR /><BR />In this blog, we will walk through the setup required to enable STS-based authentication for the AWS Adapter in SAP Integration Suite. For the AssumeRoleWithWebIdentity use case, we will use Microsoft Entra ID as an example OpenID Connect (OIDC) identity provider for the web identity federation scenario. We will also cover IAM Roles Anywhere, which enables workloads running outside AWS, such as SAP Integration Suite, to authenticate using X.509 certificates and obtain temporary AWS credentials without relying on long-lived access keys or third-party applications.<BR /></SPAN></P><P class=""><SPAN>The AWS Adapter supports the following STS authentication methods:</SPAN></P><UL><LI><STRONG><SPAN>STS (AssumeRole)</SPAN></STRONG><SPAN> – Allows a trusted AWS principal to assume an IAM role and obtain temporary security credentials.</SPAN></LI><LI><STRONG><SPAN>STS (AssumeRoleWithWebIdentity)</SPAN></STRONG><SPAN> – Uses an OpenID Connect (OIDC) identity provider to exchange a web identity token for temporary AWS security credentials.</SPAN></LI><LI><STRONG><SPAN>STS (IAM Roles Anywhere)</SPAN></STRONG><SPAN> – Uses X.509 certificates to enable workloads running outside AWS to securely assume IAM roles and obtain temporary AWS credentials.</SPAN></LI></UL><P>This blog explains the configuration steps required for all approaches.<BR /><BR />Let's start with <STRONG>STS (AssumeRole)</STRONG>, which requires the least amount of configuration among the three authentication methods. In this approach, you create an IAM role that can be assumed by an IAM user. The IAM user's access key and secret key, together with the Role ARN, are then used to configure authentication in the AWS Adapter.</P><H2 id="toc-hId-1818306120">1. STS (AssumeRole) Setup</H2><P>This setup directly links a role to an IAM user. No Azure configuration is required.</P><OL><LI><STRONG>Create IAM Role</STRONG><OL><LI>In AWS IAM, navigate to <STRONG>Roles</STRONG> and choose <STRONG>Create role</STRONG>.</LI><LI>Select <STRONG>AWS account</STRONG> as the <STRONG>Trusted entity type</STRONG>.</LI><LI>Specify the trusted AWS account ID that will be allowed to assume the role.</LI><LI>Attach the required permission policies (for example, <STRONG>AmazonS3ReadOnlyAccess</STRONG>).</LI><LI>Enter a role name and any optional description.</LI><LI>Review the configuration and choose <STRONG>Create role</STRONG>.<BR /><BR /></LI></OL></LI><LI><STRONG>Update the Trust Relationship</STRONG><OL><LI>After creating the role, open it in the IAM console and navigate to the <STRONG>Trust relationships</STRONG> tab.</LI><LI>Choose <STRONG>Edit trust policy</STRONG>.</LI><LI>Update the policy to include the ARN of the IAM user (or principal) that is allowed to assume the role under the <STRONG>Principal</STRONG> element.</LI><LI>Save the changes to update the trust relationship.</LI></OL><P>Example trust policy JSON:</P><PRE>{<BR />"Version": "2012-10-17", "Statement":[<BR />{ "Effect": "Allow",<BR />"Principal":<BR />{<BR />"AWS": "arn:aws:iam::123456789012:user/demo-sts-user"<BR />},<BR />"Action": "sts:AssumeRole"<BR />}<BR />]<BR />}</PRE></LI></OL><P>One of the most common causes of authentication failures is an incorrectly configured trust policy. This can happen if the IAM user is not added to the <STRONG>Principal</STRONG> element or if an <STRONG>External ID</STRONG> is required by the trust policy but is omitted from the AWS Adapter configuration.<BR /><BR />As the final step, create a <STRONG>Secure Parameter</STRONG> security artifact in SAP Cloud Integration (CI) to securely store the <STRONG>Role ARN Alias</STRONG>. This alias can then be referenced in the AWS adapter configuration.</P><P>Next, we'll look at <STRONG>STS (AssumeRoleWithWebIdentity)</STRONG>, which enables users authenticated by a third-party OpenID Connect (OIDC) identity provider to obtain temporary AWS credentials without requiring long-term AWS access keys.</P><H2 id="toc-hId-1621792615"><BR />2. STS (AssumeRoleWithWebIdentity) Setup</H2><P>This setup uses Microsoft Entra ID (Azure AD) as an example identity provider.</P><P><STRONG>Note</STRONG>: Supported identity providers using OpenID Connect (OIDC) can be used, such as Microsoft Entra ID, SAP IAS, or other compatible Web Identity Providers.</P><H3 id="toc-hId-1554361829"><STRONG>2.1 Microsoft Entra ID Setup</STRONG></H3><OL><LI><STRONG>Register Application</STRONG><OL class="lia-list-style-type-lower-alpha"><LI>Go to <STRONG>Microsoft Entra ID</STRONG> → <STRONG>App registrations</STRONG> → <STRONG>New registration</STRONG>.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_0-1781787649279.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423708i283D1A7F40B3DDB9/image-size/large?v=v2&px=999" role="button" title="_Irfan_Khan_0-1781787649279.png" alt="_Irfan_Khan_0-1781787649279.png" /></span><BR /><BR /></LI><LI>Provide a name, select the supported account types, and register the application.<BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_1-1781787668327.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423709iC4DDE5B728389CC2/image-size/large?v=v2&px=999" role="button" title="_Irfan_Khan_1-1781787668327.png" alt="_Irfan_Khan_1-1781787668327.png" /></span><BR /><P> </P></LI><LI>Note down the <STRONG>Tenant ID</STRONG> and <STRONG>Client ID</STRONG> from the overview tab.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_2-1781787685802.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423710i3CFD040BD2086DA6/image-size/large?v=v2&px=999" role="button" title="_Irfan_Khan_2-1781787685802.png" alt="_Irfan_Khan_2-1781787685802.png" /></span><P> </P></LI></OL></LI><LI><STRONG>Add Client Secret</STRONG><OL class="lia-list-style-type-lower-alpha"><LI>Navigate to <STRONG>Certificates & secrets → New client secret</STRONG>.</LI><LI>Create a secret and copy the <STRONG>Secret Value</STRONG> for later use.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_3-1781787818486.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423711i7A4014FFB95E6FCB/image-size/large?v=v2&px=999" role="button" title="_Irfan_Khan_3-1781787818486.png" alt="_Irfan_Khan_3-1781787818486.png" /></span><BR /><BR /></LI></OL></LI><LI><STRONG>Set Application ID URI</STRONG><OL class="lia-list-style-type-lower-alpha"><LI>Go to <STRONG>Expose an API → Application ID URI</STRONG>.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_4-1781787842898.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423713iE4EC42B63B850A2D/image-size/large?v=v2&px=999" role="button" title="_Irfan_Khan_4-1781787842898.png" alt="_Irfan_Khan_4-1781787842898.png" /></span><P> </P></LI><LI>Set it to api://<client-id> (This will be set automatically).<BR /><BR /></LI></OL></LI><LI><STRONG>Configure Access Token Version</STRONG><OL class="lia-list-style-type-lower-alpha"><LI>In the application <STRONG>Manifest</STRONG>, set requestedAccessTokenVersion to <STRONG>2</STRONG>.</LI></OL></LI></OL><H3 id="toc-hId-1357848324"><STRONG>2.2 AWS IAM Setup (Identity Provider & Role)</STRONG></H3><OL><LI><STRONG>Add OpenID Connect Identity Provider</STRONG><OL class="lia-list-style-type-lower-alpha"><LI><SPAN>Log in to the </SPAN><STRONG><SPAN>AWS Management Console</SPAN></STRONG><SPAN> and navigate to </SPAN><STRONG><SPAN>IAM</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>In the left navigation pane, select </SPAN><STRONG><SPAN>Identity providers</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>Click </SPAN><STRONG><SPAN>Add provider</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>Configure the identity provider with the following details:</SPAN><UL><LI><STRONG><SPAN>Provider Type:</SPAN></STRONG> OpenID Connect</LI><LI><P class=""><STRONG><SPAN>Provider URL:</SPAN></STRONG></P><PRE><CODE><SPAN>https://login.microsoftonline.com/<tenant-id>/v2.0</SPAN></CODE></PRE></LI><LI><P class=""><STRONG><SPAN>Audience:</SPAN></STRONG></P><PRE><CODE><SPAN><client-id></SPAN></CODE></PRE></LI></UL></LI><LI><SPAN>Click </SPAN><STRONG><SPAN>Add provider</SPAN></STRONG><SPAN> to create the OpenID Connect (OIDC) identity provider.<BR /><BR /></SPAN></LI></OL></LI><LI><STRONG>Create IAM Role for Web Identity</STRONG><OL class="lia-list-style-type-lower-alpha"><LI><SPAN>Log in to the </SPAN><STRONG><SPAN>AWS Management Console</SPAN></STRONG><SPAN> and navigate to </SPAN><STRONG><SPAN>IAM</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>In the left navigation pane, select </SPAN><STRONG><SPAN>Roles</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>Click </SPAN><STRONG><SPAN>Create role</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>Under </SPAN><STRONG><SPAN>Trusted entity type</SPAN></STRONG><SPAN>, select </SPAN><STRONG><SPAN>Web identity</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>Configure the trust relationship:</SPAN><UL><LI><SPAN>Select the previously created </SPAN><STRONG><SPAN>OpenID Connect (OIDC) provider</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>Select the appropriate </SPAN><STRONG><SPAN>Audience</SPAN></STRONG><SPAN> (<client-id></SPAN><SPAN>).</SPAN></LI></UL></LI><LI><SPAN>Click </SPAN><STRONG><SPAN>Next</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>Attach the required IAM permission policies that grant access to the AWS resources your application or integration needs.</SPAN></LI><LI><SPAN>Click </SPAN><STRONG><SPAN>Next</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>Enter a </SPAN><STRONG><SPAN>Role Name</SPAN></STRONG><SPAN> and, optionally, a description.</SPAN></LI><LI><SPAN>Review the role configuration and click </SPAN><STRONG><SPAN>Create role</SPAN></STRONG><SPAN>.</SPAN></LI><LI><SPAN>After the role is created, note the </SPAN><STRONG><SPAN>Role ARN</SPAN></STRONG><SPAN>, as it may be required for application configuration or role assumption requests.</SPAN></LI></OL></LI></OL><H3 id="toc-hId-1161334819"><STRONG>2.3 SAP CPI Configuration</STRONG></H3><P><STRONG>1. OAuth2 Client Credentials:</STRONG></P><OL><LI>In SAP Cloud Integration, navigate to <STRONG>Monitor</STRONG> → <STRONG>Security</STRONG> <STRONG>Material</STRONG>.</LI><LI>Click <STRONG>Add</STRONG> and select OAuth2 Client Credentials.</LI><LI>Maintain the following details:<BR /><DIV class=""> </DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_0-1781788073683.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423714iEEED982F5ED9E44E/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_0-1781788073683.png" alt="_Irfan_Khan_0-1781788073683.png" /></span></DIV><UL><LI><SPAN>Name: <Security Artifact Name></SPAN></LI><LI><P class=""><SPAN>Token Service URL:</SPAN></P><PRE><CODE><SPAN>https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token</SPAN></CODE></PRE></LI><LI><P class=""><SPAN>Client ID:</SPAN></P><PRE><CODE><SPAN><client-id></SPAN></CODE></PRE></LI><LI><P class=""><SPAN>Grant Type:</SPAN></P><PRE><CODE><SPAN>Send as Part of Body</SPAN></CODE></PRE></LI><LI><P class=""><SPAN>Client Secret:</SPAN></P><PRE><CODE><SPAN><client-secret></SPAN></CODE></PRE></LI><LI><P class=""><SPAN>Scope:</SPAN></P><PRE><CODE><SPAN>api://<client-id>/.default</SPAN></CODE></PRE></LI><LI><P class=""><SPAN>Client Authentication:</SPAN></P><PRE><CODE><SPAN>Send as Body Parameter</SPAN></CODE></PRE></LI><LI><P class=""><SPAN>Content Type:</SPAN></P><PRE><CODE><SPAN>application/x-www-form-urlencoded</SPAN></CODE></PRE></LI></UL></LI><LI><STRONG>Save</STRONG> and <STRONG>deploy</STRONG> the security artifact.</LI><LI><P>Reference this <STRONG>OAuth2 Client Credentials</STRONG> security artifact in the sender or receiver adapter by specifying it in the <STRONG>OIDC Credential Name</STRONG> field.</P></LI></OL><P><STRONG>2. Secure Parameter (Role ARN)</STRONG></P><OL><LI>In SAP Cloud Integration, navigate to <STRONG>Monitor</STRONG> → <STRONG>Security</STRONG> <STRONG>Material</STRONG>.</LI><LI>Click <STRONG>Add</STRONG> and select <STRONG>Secure</STRONG> <STRONG>Parameter</STRONG>.</LI><LI>Store the <STRONG>Role ARN</STRONG><SPAN> from AWS and deploy.</SPAN><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_1-1781788128179.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423715iAA04C439CB406848/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_1-1781788128179.png" alt="_Irfan_Khan_1-1781788128179.png" /></span></LI><LI>Use the <STRONG>Role ARN Alias</STRONG> in the adapter configuration to enable AWS authentication.</LI></OL><P> </P><P>Lastly, we'll look at <STRONG>STS (IAM Roles Anywhere)</STRONG>, which enables workloads running outside AWS to assume IAM roles using X.509 certificates and obtain temporary AWS security credentials without relying on long-lived access keys.</P><H2 id="toc-hId-835738595"><BR />3. STS (IAMRolesAnywhere) Setup</H2><P><STRONG>Note:</STRONG> In this guide, <STRONG>Keystore Explorer</STRONG> is used to create the certificates required for the IAM Roles Anywhere configuration.</P><H3 id="toc-hId-768307809">3.1 Create a Key Pair for IAMRolesAnywhere Authentication</H3><OL><LI>Open KeyStore Explorer and create a new KeyStore; select PKCS #12 as the type.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_1-1781766772652.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423512i13BE5339ABF1D0A3/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_1-1781766772652.png" alt="_Irfan_Khan_1-1781766772652.png" /></span><BR /><BR /></LI><LI>Click on <STRONG>Tools</STRONG> > <STRONG>Generate Key Pair.</STRONG> Retain default selections of <STRONG>RSA</STRONG> and a minimum <STRONG>Key Size </STRONG>of at least 2048 bits.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_2-1781766784664.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423513i12B83435906A0D2A/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_2-1781766784664.png" alt="_Irfan_Khan_2-1781766784664.png" /></span><BR /><BR /></LI><LI>Select <STRONG>Version 3</STRONG> in the <STRONG>Generate Key Pair Certificate </STRONG>pop-up window.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_3-1781766800379.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423514i5FB99DBC65CB80EF/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_3-1781766800379.png" alt="_Irfan_Khan_3-1781766800379.png" /></span><BR /><BR /></LI><LI>Click on <span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_10-1781768923769.png" style="width: 16px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423546i72D7AAC729C3B220/image-dimensions/16x14?v=v2" width="16" height="14" role="button" title="_Irfan_Khan_10-1781768923769.png" alt="_Irfan_Khan_10-1781768923769.png" /></span> <P> </P>icon to edit name-related details.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_4-1781766808359.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423515i9E862A80D1C29DB0/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_4-1781766808359.png" alt="_Irfan_Khan_4-1781766808359.png" /></span><BR /><BR /></LI><LI>Click <STRONG>Add</STRONG> Extensions. You can add Certificate Extensions by clicking on "+".<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_5-1781766842508.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423516i6C485BE8A89DF2F3/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_5-1781766842508.png" alt="_Irfan_Khan_5-1781766842508.png" /></span><P> </P></LI></OL><H3 id="toc-hId-571794304">3.2 Creating Key Pair: CERTIFICATE AUTHORITY</H3><P> 6. For <STRONG>Certificate</STRONG> <STRONG>Authority</STRONG>, add the following extensions.</P><OL class="lia-list-style-type-lower-alpha"><LI>Basic Constraints = <STRONG>critical</STRONG>, CA = <STRONG>TRUE</STRONG></LI></OL><P><STRONG>Note:</STRONG> The path length constraint in the Basic Constraints extension determines how many subordinate CA levels can exist below a CA certificate. Configure this value based on your intended certificate hierarchy.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_6-1781766918479.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423517iD63EB9DD793A2EC9/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_6-1781766918479.png" alt="_Irfan_Khan_6-1781766918479.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_7-1781766926681.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423518iB419EC031617C3BC/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_7-1781766926681.png" alt="_Irfan_Khan_7-1781766926681.png" /></span></P><P> b. Key Usage(KU) = <STRONG>Certificate Signing</STRONG>, <STRONG>CRL Sign</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_8-1781766968491.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423519i70F48C25E1D88C53/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_8-1781766968491.png" alt="_Irfan_Khan_8-1781766968491.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_9-1781766977866.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423520iBCFD7905BC37118E/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_9-1781766977866.png" alt="_Irfan_Khan_9-1781766977866.png" /></span></P><P> c. Subject Key Identifier (SKI) = NOT CRITICAL</P><P><STRONG>Note:</STRONG> Click on the key icon to select a Generation Method.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_10-1781767015391.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423521iF95E6E32FDE62080/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_10-1781767015391.png" alt="_Irfan_Khan_10-1781767015391.png" /></span><BR /><BR /> 7. Enter the name as <STRONG>ROOT_CA</STRONG>.<BR /> 8. Enter and Confirm Password.<BR /> 9. You will get a message notifying you of Key Pair Creation.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_11-1781767103864.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423522i0FC448B1F2A5A4A8/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_11-1781767103864.png" alt="_Irfan_Khan_11-1781767103864.png" /></span></P><P> </P><H3 id="toc-hId-375280799">3.3 Creating Key Pair: CLIENT</H3><P><STRONG>Note: </STRONG><SPAN>Repeat </SPAN><STRONG>Steps 1–5</STRONG><SPAN> from the section above, then continue from </SPAN>Step <STRONG>10</STRONG><SPAN> as shown below.</SPAN></P><P>10. For Client Certificate, add the following extensions.</P><P>a. Basic Constraints = <STRONG>critical</STRONG>, CA = <STRONG>FALSE</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_12-1781768038214.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423524i9AB309AA44C522EC/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_12-1781768038214.png" alt="_Irfan_Khan_12-1781768038214.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_13-1781768047929.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423525i124749F3D1073A95/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_13-1781768047929.png" alt="_Irfan_Khan_13-1781768047929.png" /></span><BR /><BR />b. Key Usage (KU) = <STRONG>Digital Signature</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_14-1781768097374.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423528i83D255487544936E/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_14-1781768097374.png" alt="_Irfan_Khan_14-1781768097374.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_15-1781768103705.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423529iE88763CAD16BD07B/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_15-1781768103705.png" alt="_Irfan_Khan_15-1781768103705.png" /></span></P><P>c. Subject Key Identifier (SKI) = NOT CRITICAL</P><P><STRONG>Note:</STRONG> Click on the key icon to select a Generation Method.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_16-1781768123515.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423530iCBF3336F22ECD11D/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_16-1781768123515.png" alt="_Irfan_Khan_16-1781768123515.png" /></span></P><P>11. Enter the Alias as CLIENT.<BR />12. Enter and Confirm Password.<BR />13. You will get a message notifying Key Pair Creation.<BR /><BR /></P><H3 id="toc-hId-178767294">3.4 Fetching the PEM from CERTIFICATE_AUTHORITY</H3><OL><LI>Navigate your <STRONG>ROOT_CA</STRONG> certificate in KeyStore Explorer.</LI><LI>Double-click on the certificate > <STRONG>PEM</STRONG><SPAN> > </SPAN><STRONG>Copy</STRONG><SPAN>.<BR /></SPAN>This will be required at a later step.</LI></OL><H3 id="toc-hId--92977580">3.5 Configurations in AWS</H3><P><STRONG>Note:</STRONG> Before proceeding with this section, ensure you have completed the previous steps to create CLIENT and CERTIFICATE_AUTHORITY certificates and copied the PEM.</P><OL><LI>Fetch the PEM that you copied in the CERTIFICATE AUTHORITY section and paste it in the <STRONG>External certificate bundle</STRONG> while creating the Trust Anchor. For more information, see <SPAN><A href="https://docs.aws.amazon.com/rolesanywhere/latest/userguide/getting-started.html#getting-started-step1" target="_blank" rel="noopener nofollow noreferrer">Create Trust Anchor</A></SPAN>.</LI><LI>Next, you must update the trust policy to include rolesanywhere.amazonaws.com and create a Profile under Role. For more information, see <SPAN><A href="https://docs.aws.amazon.com/rolesanywhere/latest/userguide/getting-started.html#getting-started-step2" target="_blank" rel="noopener nofollow noreferrer">Configure Role and create Profile</A></SPAN>.</LI></OL><H3 id="toc-hId--289491085">3.6 Generating the CSR using CLIENT</H3><OL><LI>Navigate to your CLIENT certificate in KeyStore Explorer.</LI><LI>Right-click on the certificate > <STRONG>Generate CSR</STRONG>.</LI><LI>Save it for signing CA later. This will be required at a later step.</LI></OL><H3 id="toc-hId--486004590">3.7 Signing CLIENT using CERTIFICATE_AUTHORITY</H3><OL><LI>Navigate to your ROOT_CA certificate in KeyStore Explorer.</LI><LI>Right-click on the certificate > <STRONG>Sign CSR</STRONG>.</LI><LI>In the <STRONG>Choose CSR</STRONG> dialog, select the <STRONG>CSR</STRONG> created using CLIENT.</LI><LI>In the Sign CSR dialog, click Transfer extensions and click <STRONG>OK</STRONG>.</LI></OL><P><STRONG>Note:</STRONG> Transfer Extension allows you to skip the Add Extensions step by copying extensions from the Client.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_2-1781768552531.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423537i1597D788137302DA/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_2-1781768552531.png" alt="_Irfan_Khan_2-1781768552531.png" /></span></P><P> 5. Next, you will see an <STRONG>Export Certificate Chain</STRONG> ‘client‘. Ensure <STRONG>Export Length</STRONG> is selected as <STRONG>Entire Chain </STRONG>and <STRONG>Export Format</STRONG> is <STRONG>X.509</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_1-1781768504604.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423536i150DE48D3C9447CB/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_1-1781768504604.png" alt="_Irfan_Khan_1-1781768504604.png" /></span></P><P> 6. You will be able to see a prompt that notifies you about successful CSR Signing.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_3-1781768582331.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423538iFC71F5A8AF872931/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_3-1781768582331.png" alt="_Irfan_Khan_3-1781768582331.png" /></span></P><P><STRONG>Note</STRONG>: <SPAN>A Root CA can sign one or more Intermediate CAs, which can then issue client (leaf) certificates, forming a trusted certificate chain from the leaf certificate to the Root CA</SPAN></P><H3 id="toc-hId--682518095">3.8 Importing the CA Reply to CLIENT</H3><OL><LI>Navigate your CLIENT certificate in KeyStore Explorer.</LI><LI>Right-click on the certificate >> <STRONG>Import CA Reply</STRONG>.</LI><LI>Select your <STRONG>.cer</STRONG> file and click <STRONG>Import</STRONG>.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_5-1781768698547.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423541i95909226857BD974/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_5-1781768698547.png" alt="_Irfan_Khan_5-1781768698547.png" /></span><BR /><BR /></LI><LI>You will get the following prompt if the previous step is successful.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_6-1781768708192.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423542i78A8F7B703981AE8/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_6-1781768708192.png" alt="_Irfan_Khan_6-1781768708192.png" /></span><BR /><BR /></LI><LI> Further, if you double-click on the Client certificate, you can see the hierarchy showing that CLIENT has been signed by ROOT_CA.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_7-1781768715047.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423543i152DEE781B7C424F/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_7-1781768715047.png" alt="_Irfan_Khan_7-1781768715047.png" /></span></LI></OL><H3 id="toc-hId--879031600">3.9 Exporting the Client Certificate</H3><OL><LI>Navigate your CLIENT certificate in KeyStore Explorer.</LI><LI>Right-click on the certificate >> <STRONG>Export Key Pair</STRONG>.</LI><LI>Select <STRONG>Format</STRONG> as <STRONG>PCKS#12</STRONG> and specify a <STRONG>Password</STRONG>.</LI></OL><P><STRONG>Note</STRONG>: You will be required to specify this password during Key Pair upload in SAP Integration Suite.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_8-1781768830695.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423544i2B091CBC9D65466B/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_8-1781768830695.png" alt="_Irfan_Khan_8-1781768830695.png" /></span></P><P> 4. A successful export will be confirmed by the following prompt.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="_Irfan_Khan_9-1781768851339.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/423545iEF3F6DFAC781DD57/image-size/medium?v=v2&px=400" role="button" title="_Irfan_Khan_9-1781768851339.png" alt="_Irfan_Khan_9-1781768851339.png" /></span><BR /> 5. The final step is to upload the .pfx file to the SAP Keystore. For more information, see <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/uploading-key-pair" target="_blank" rel="noopener noreferrer">Uploading a Key Pair in SAP Keystore</A><SPAN>.</SPAN></P><P><STRONG>Note</STRONG>: <SPAN>All IAM Roles Anywhere resources are regional, and they must be created in the same account and region to be used together.</SPAN></P><H2 id="toc-hId--782142098">Conclusion</H2><P>The authentication method you choose ultimately depends on your organization's security requirements and how workloads outside AWS are expected to access AWS resources. While all three approaches use AWS Security Token Service (STS) to issue temporary security credentials, they differ in how the requesting workload is authenticated.</P><P>If your organization already uses IAM users and is comfortable managing long-lived AWS access keys, <STRONG>STS (AssumeRole)</STRONG> is the simplest option. It allows you to combine an IAM user's access key and secret key with a restricted IAM role to obtain temporary credentials, making it a straightforward upgrade from static IAM user permissions.</P><P>If your organization wants to eliminate long-lived AWS access keys and already has an OpenID Connect (OIDC) identity provider, such as Microsoft Entra ID or SAP IAS, <STRONG>STS (AssumeRoleWithWebIdentity)</STRONG> is a better choice. It enables workloads to authenticate using identity tokens issued by the trusted identity provider, removing the need to store AWS credentials.</P><P>Finally, if your organization prefers not to depend on either long-lived AWS access keys or a third-party identity provider, <STRONG>STS (IAM Roles Anywhere)</STRONG> provides a certificate-based authentication model. Although it requires additional setup to establish a certificate trust chain, it is well-suited for workloads running outside AWS that require strong, certificate-based authentication without relying on external identity providers.</P><P>By understanding the strengths and trade-offs of each authentication method, you can choose the approach that best aligns with your organization's security policies, operational requirements, and infrastructure.</P><P> </P>2026-07-20T09:05:33.364000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/useful-functions-for-xslt-in-sap-cpi/ba-p/14443169Useful functions for XSLT in SAP CPI2026-07-20T12:05:03.993000+02:00jo_krhttps://community.sap.com/t5/user/viewprofilepage/user-id/212163<P><a href="https://community.sap.com/t5/c-khhcw49343/SAP+Integration+Suite/pd-p/73554900100800003241" class="lia-product-mention" data-product="23-1">SAP Integration Suite</a> </P><P>Following up on my previous blog post <A href="https://community.sap.com/t5/technology-blog-posts-by-members/useful-functions-for-xslt-2-0-in-sap-po/ba-p/13561824" target="_blank">Useful functions for XSLT 2.0 in SAP PO</A>, where we leveraged Java extension calls and standard XSLT features within the Process Orchestration engine, this article addresses a common gap encountered when transitioning to or developing natively in <STRONG>SAP Integration Suite (Cloud Integration / CPI)</STRONG>.</P><P>In SAP Integration Suite, it is is well-documented for Groovy how to manipulate the Message Processing Log with the following methods</P><UL><LI><SPAN>addCustomHeaderProperty</SPAN></LI><LI><SPAN>setStringProperty</SPAN> or</LI><LI><SPAN>addAttachmentAsString</SPAN></LI></UL><P>(see <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/add-information-to-message-processing-log?locale=en-US" target="_blank" rel="noopener noreferrer">Add Information to the Message Processing Log</A>).</P><P>However, when executing XSLT 2.0/3.0 transformations, no native XSLT-level mechanism exists to directly interact with the MPL context. The lightweight Java utility below serves as a bridge to fill this gap.</P><H2 id="toc-hId-1820027364">Fast Lane</H2><OL><LI>Download jar: <A href="https://github.com/jokr0815/cpi_xslt_mpl_extension" target="_blank" rel="noopener nofollow noreferrer">https://github.com/jokr0815/cpi_xslt_mpl_extension</A></LI><LI>import into iFlow as archive</LI><LI>Put any xslt step into your iFow and use the java extension, namespace: <BR />xmlns:mpl="java:script.MPLWriter" with its functions: <BR />- mpl:setStringProperty($SAP_MessageProcessingLog, $string-key, $string-value)<BR />- mpl:addCustomHeaderProperty($SAP_MessageProcessingLog, $string-key, $string-value, $debugEnabled)<BR />- mpl:addAttachmentAsString($SAP_MessageProcessingLog, $string-filename, $string-content,$string-mimetype, $debugEnabled)<BR /><BR /></LI></OL><H2 id="toc-hId-1623513859">Overview & Design Principles</H2><P>The <CODE>MPLWriter</CODE> class uses OSGi runtime reflection and service lookup to interact directly with the CPI execution context passed into Java extension calls in Saxon/XSLT steps.</P><UL><LI><STRONG>Compile-Time Dependencies:</STRONG><BR />Only one external jar is needed: <CODE>org.osgi.core-6.0.0.jar</CODE>.<BR />(No SAP CPI runtime JARs are needed in your build environment.)</LI></UL><H2 id="toc-hId-1427000354">Legal Disclaimer & License</H2><PRE><CODE>MIT License
Copyright (c) HO2 Systemberatung GmbH
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.</CODE></PRE><P><STRONG>Disclaimer:</STRONG> This code is provided as-is without any warranty for correctness, completeness, or fitness for a particular purpose. It relies on non-public runtime structures resolved via reflection. This solution is completely independent and/or <FONT color="#FF0000">completely unsupported by SAP,</FONT> by myself and/or my company - use it at your own risk <span class="lia-unicode-emoji" title=":slightly_smiling_face:">🙂</span></P><H2 id="toc-hId-1230486849">Source Code: <CODE>MPLWriter.java</CODE></H2><pre class="lia-code-sample language-java"><code>/*
* Copyright (c) HO2 Systemberatung GmbH
* Licensed under the MIT License.
*/
package script;
import java.io.ByteArrayInputStream;
import java.lang.reflect.Method;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
/**
* Utility class to interact with SAP Integration Suite Message Processing Log (MPL)
* dynamically from XSLT Java Extensions via OSGi and Reflection.
*
* <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1878813">@Author</a> HO2 Systemberatung GmbH
*/
public class MPLWriter {
private static int debugCounter = 0;
/**
* Sets a string property on the Message Processing Log.
*/
public static Object setStringProperty(Object mpl, String name, Object value) throws Exception {
Object key = createTypedKey(mpl, name, String.class);
return put(mpl, key, value);
}
/**
* Adds a custom header property (User Defined Attribute) to the MPL.
*/
public static String addCustomHeaderProperty(Object mpl, String name, String value) throws Exception {
return addCustomHeaderProperty(mpl, name, value, false);
}
public static String addCustomHeaderProperty(Object mpl, String name, String value, boolean debugEnabled)
throws Exception {
debug(mpl, debugEnabled, "START addCustomHeaderProperty " + name + "=" + value);
Object rootMpl = mpl.getClass().getMethod("getRoot").invoke(mpl);
ClassLoader loader = mpl.getClass().getClassLoader();
Class<?> udaClass = loader.loadClass("com.sap.it.op.mpl.UserDefinedAttributeTypeV2");
Class<?> keysClass = loader.loadClass("com.sap.it.op.mpl.TypedMessageProcessingLogKeys");
Object udaKey = keysClass.getField("TK_USER_DEFINED_ATTRIBUTES").get(null);
Method get = rootMpl.getClass().getMethod("get", udaKey.getClass());
Object uda = get.invoke(rootMpl, udaKey);
if (uda == null) {
uda = udaClass.getDeclaredConstructor().newInstance();
rootMpl.getClass().getMethod("put", udaKey.getClass(), Object.class).invoke(rootMpl, udaKey, uda);
}
Method grantAttribute = udaClass.getMethod("grantAttribute", String.class);
@SuppressWarnings("unchecked")
Set<String> values = (Set<String>) grantAttribute.invoke(uda, name);
values.add(value);
debug(mpl, debugEnabled, "UDA final=" + uda);
return "OK";
}
/**
* Adds an attachment to the Message Processing Log (Normal Mode).
*/
public static String addAttachmentAsString(Object mpl, String name, String content, String mimeType)
throws Exception {
return addAttachmentAsString(mpl, name, content, mimeType, false);
}
/**
* Adds an attachment to the Message Processing Log (Debug Mode).
*/
public static String addAttachmentAsString(Object mpl, String name, String content, String mimeType,
boolean debugEnabled) throws Exception {
debug(mpl, debugEnabled, "START addAttachment name=" + name);
// Obtain OSGi bundle context dynamically via Message class loader
Bundle bundle = FrameworkUtil.getBundle(Class.forName("com.sap.gateway.ip.core.customdev.util.Message"));
debug(mpl, debugEnabled, "Bundle=" + bundle);
BundleContext ctx = bundle.getBundleContext();
ServiceReference<?> ref = ctx.getServiceReference("com.sap.esb.camel.message.storage.api.MessageStorageWrite");
debug(mpl, debugEnabled, "MessageStorage reference=" + ref);
if (ref == null) {
return "MessageStorageWrite service not found";
}
Object messageStore = null;
try {
messageStore = ctx.getService(ref);
Class<?> messageClass = messageStore.getClass().getClassLoader()
.loadClass("com.sap.esb.camel.message.storage.api.Message");
Object attachmentMessage = messageClass.getDeclaredConstructor().newInstance();
/*
* Set Attachment Headers
*/
Map<String, String> headers = new HashMap<>();
headers.put("SapAttachmentName", name);
headers.put("SapAttachmentContentType", mimeType);
messageClass.getMethod("setHeader", Map.class).invoke(attachmentMessage, headers);
/*
* Set Body Content
*/
byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
debug(mpl, debugEnabled, "Attachment bytes=" + bytes.length);
Method setBody = null;
for (Method m : messageClass.getMethods()) {
if ("setBody".equals(m.getName()) && m.getParameterCount() == 1) {
setBody = m;
break;
}
}
if (setBody == null) {
throw new Exception("Message.setBody not found");
}
debug(mpl, debugEnabled, "setBody type=" + setBody.getParameterTypes()[0].getName());
setBody.invoke(attachmentMessage, new ByteArrayInputStream(bytes));
/*
* Resolve MPL Identifiers
*/
Object messageGuid = getMplValue(mpl, "MessageGuid");
Object stepId = getMplValue(mpl, "StepId");
debug(mpl, debugEnabled, "MessageGuid=" + messageGuid);
debug(mpl, debugEnabled, "StepId=" + stepId);
if (messageGuid == null) {
throw new Exception("MessageGuid not found");
}
messageClass.getMethod("setMplID", String.class).invoke(attachmentMessage, messageGuid.toString());
if (stepId != null) {
messageClass.getMethod("setStepID", String.class).invoke(attachmentMessage, stepId.toString());
}
/*
* Tag Message as ATTACHMENT
*/
Class<?> tagClass = messageClass.getClassLoader()
.loadClass("com.sap.esb.camel.message.storage.api.Message$TagKey");
@SuppressWarnings({ "unchecked", "rawtypes" })
Object attachmentTag = Enum.valueOf((Class) tagClass, "ATTACHMENT");
messageClass.getMethod("setTagKey", tagClass).invoke(attachmentMessage, attachmentTag);
/*
* Persist Attachment to Storage
*/
URI uri = (URI) messageStore.getClass().getMethod("add", messageClass, boolean.class).invoke(messageStore,
attachmentMessage, true);
debug(mpl, debugEnabled, "Attachment URI=" + uri);
/*
* Register Attachment URI in MPL Attachment List
*/
Object attachments = getMplValue(mpl, "attachments");
debug(mpl, debugEnabled, "Existing attachments=" + attachments);
if (attachments == null) {
attachments = new ArrayList<>();
Object key = createTypedKey(mpl, "attachments", List.class);
put(mpl, key, attachments);
}
Class<?> attachmentType = mpl.getClass().getClassLoader().loadClass("com.sap.it.op.mpl.AttachmentType");
Object attachment = attachmentType.getDeclaredConstructor().newInstance();
attachmentType.getMethod("setName", String.class).invoke(attachment, name);
attachmentType.getMethod("setURI", URI.class).invoke(attachment, uri);
@SuppressWarnings("unchecked")
List<Object> list = (List<Object>) attachments;
list.add(attachment);
debug(mpl, debugEnabled, "Attachment list size=" + list.size());
return "CREATED URI=" + uri;
} finally {
if (ref != null) {
ctx.ungetService(ref);
}
}
}
private static Object createTypedKey(Object mpl, String name, Class<?> type) throws Exception {
Class<?> keyClass = findKeyClass(mpl);
Method grant = keyClass.getMethod("grantKey", Class.class, String.class);
return grant.invoke(null, type, name);
}
private static Class<?> findKeyClass(Object mpl) throws Exception {
for (Method m : mpl.getClass().getMethods()) {
if ("put".equals(m.getName()) && m.getParameterCount() == 2) {
Class<?>[] params = m.getParameterTypes();
if (params[1].equals(Object.class)) {
return params[0];
}
}
}
throw new Exception("TypedMessageProcessingLogKey not found");
}
private static Object put(Object mpl, Object key, Object value) throws Exception {
Method put = mpl.getClass().getMethod("put", key.getClass(), Object.class);
return put.invoke(mpl, key, value);
}
private static Object getMplValue(Object mpl, String name) throws Exception {
Class<?> keyClass = findKeyClass(mpl);
Object key = createTypedKey(mpl, name, guessKeyType(name));
Method get = mpl.getClass().getMethod("get", keyClass);
return get.invoke(mpl, key);
}
private static Class<?> guessKeyType(String name) {
switch (name) {
case "MessageGuid":
case "StepId":
return String.class;
case "attachments":
return List.class;
default:
return Object.class;
}
}
private static synchronized void debug(Object mpl, boolean enabled, Object value) {
if (!enabled) {
return;
}
try {
setStringProperty(mpl, "MPL_DEBUG_" + String.format("%02d", ++debugCounter), String.valueOf(value));
} catch (Exception ignored) {
}
}
}</code></pre><H2 id="toc-hId-1033973344">XSLT Call Example</H2><P>Below there is a sample xsl stylesheet to make use of the little helper.</P><P><span class="lia-unicode-emoji" title=":information:">ℹ️</span>Output generated by <CODE>saxon:trace</CODE> is redirected to the standard application server logging channel. In CPI, you can find these log lines directly in the web UI under <STRONG>Monitoring > System-Logs</STRONG> (or by downloading the tail/system log file for the node execution).</P><pre class="lia-code-sample language-markup"><code><?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:saxon="http://saxon.sf.net/" xmlns:mpl="java:script.MPLWriter" exclude-result-prefixes="xs saxon mpl">
<!-- SAP CPI injects the Message Processing Log object -->
<xsl:param name="SAP_MessageProcessingLog"/>
<!-- Enable MPL debug -->
<xsl:param name="debugEnabled" select="true()"/>
<!-- Saxon template execution tracing -->
<xsl:mode on-multiple-match="use-last" use-accumulators="itemCount totalQuantity" saxon:trace="yes"/>
<!-- Count items -->
<xsl:accumulator name="itemCount" as="xs:integer" initial-value="0" saxon:trace="yes">
<xsl:accumulator-rule match="Item" select="$value + 1"/>
</xsl:accumulator>
<!-- Sum quantities -->
<xsl:accumulator name="totalQuantity" as="xs:integer" initial-value="0" saxon:trace="yes">
<xsl:accumulator-rule match="Quantity/text()" select="$value + xs:integer(.)"/>
</xsl:accumulator>
<xsl:template match="/">
<xsl:variable name="orderId" select="string(Order/Header/ID)"/>
<xsl:variable name="customer" select="string(Order/Header/CustomerNumber)"/>
<!-- MPL properties -->
<xsl:variable name="status1" select="mpl:setStringProperty($SAP_MessageProcessingLog,'XSLT_STATUS','STARTED')"/>
<xsl:variable name="orderProperty" select="mpl:setStringProperty($SAP_MessageProcessingLog,'ORDER_ID',$orderId)"/>
<!-- MPL Custom Header Properties -->
<xsl:variable name="header1" select="mpl:addCustomHeaderProperty($SAP_MessageProcessingLog,'PROCESSING_TYPE','XSLT3_DEMO',$debugEnabled)"/>
<xsl:variable name="header2" select="mpl:addCustomHeaderProperty($SAP_MessageProcessingLog,'CUSTOMER_NUMBER',$customer,$debugEnabled)"/>
<!-- HTML attachment -->
<xsl:variable name="html" select="
mpl:addAttachmentAsString(
$SAP_MessageProcessingLog,
'order-summary.html',
concat(
'&lt;html&gt;',
'&lt;body&gt;',
'&lt;h1&gt;SAP CPI XSLT 3.0 Demo&lt;/h1&gt;',
'&lt;h2&gt;Order ',
$orderId,
'&lt;/h2&gt;',
'&lt;p&gt;Customer: ',
$customer,
'&lt;/p&gt;',
'&lt;table border=&quot;1&quot;&gt;',
'&lt;tr&gt;&lt;th&gt;Material&lt;/th&gt;&lt;th&gt;Quantity&lt;/th&gt;&lt;/tr&gt;',
string-join(
for $i in Order/Items/Item
return concat(
'&lt;tr&gt;',
'&lt;td&gt;',
$i/Material,
'&lt;/td&gt;',
'&lt;td&gt;',
$i/Quantity,
'&lt;/td&gt;',
'&lt;/tr&gt;'
),
''
),
'&lt;/table&gt;',
'&lt;p&gt;Items: ',
accumulator-after('itemCount'),
'&lt;/p&gt;',
'&lt;p&gt;Total Quantity: ',
accumulator-after('totalQuantity'),
'&lt;/p&gt;',
'&lt;/body&gt;',
'&lt;/html&gt;'
),
'text/html',
$debugEnabled
)
"/>
<!-- Store calculated values -->
<xsl:variable name="itemCount" select="mpl:setStringProperty($SAP_MessageProcessingLog,'ITEM_COUNT',string(accumulator-after('itemCount')))"/>
<xsl:variable name="quantity" select="mpl:setStringProperty($SAP_MessageProcessingLog,'TOTAL_QUANTITY',string(accumulator-after('totalQuantity')))"/>
<xsl:variable name="status2" select="mpl:setStringProperty($SAP_MessageProcessingLog,'XSLT_STATUS','COMPLETED')"/>
<!-- XML result -->
<OrderResult>
<Header>
<ID>
<xsl:value-of select="$orderId"/>
</ID>
<Customer>
<xsl:value-of select="$customer"/>
</Customer>
</Header>
<Items>
<xsl:apply-templates select="Order/Items/Item"/>
</Items>
<Summary>
<ItemCount>
<xsl:value-of select="accumulator-after('itemCount')"/>
</ItemCount>
<TotalQuantity>
<xsl:value-of select="accumulator-after('totalQuantity')"/>
</TotalQuantity>
</Summary>
</OrderResult>
</xsl:template>
<!-- Item transformation -->
<xsl:template match="Item">
<Item>
<Material>
<xsl:value-of select="Material"/>
</Material>
<Quantity>
<xsl:value-of select="Quantity"/>
</Quantity>
</Item>
</xsl:template>
</xsl:stylesheet></code></pre><H2 id="toc-hId-837459839">Input XML Example</H2><P>Below is a sample input XML payload processed by the XSLT mapping above, from which the Order ID is dynamically extracted and pushed into the MPL Custom Header Property:</P><pre class="lia-code-sample language-markup"><code><?xml version="1.0" encoding="UTF-8"?>
<Order>
<Header>
<ID>4500012345</ID>
<Date>2026-07-17</Date>
<CustomerNumber>1002934</CustomerNumber>
<Priority>HIGH</Priority>
<SalesOrganization>1710</SalesOrganization>
</Header>
<Items>
<Item>
<LineNumber>10</LineNumber>
<Material>MAT-8842</Material>
<Description>Industrial Sensor</Description>
<Quantity>50</Quantity>
<Unit>EA</Unit>
<NetValue>1250.00</NetValue>
</Item>
<Item>
<LineNumber>20</LineNumber>
<Material>MAT-9921</Material>
<Description>Control Module</Description>
<Quantity>25</Quantity>
<Unit>EA</Unit>
<NetValue>3750.00</NetValue>
</Item>
<Item>
<LineNumber>30</LineNumber>
<Material>MAT-5500</Material>
<Description>Mounting Bracket</Description>
<Quantity>100</Quantity>
<Unit>EA</Unit>
<NetValue>500.00</NetValue>
</Item>
<Item>
<LineNumber>40</LineNumber>
<Material>MAT-7711</Material>
<Description>Power Supply</Description>
<Quantity>10</Quantity>
<Unit>EA</Unit>
<NetValue>900.00</NetValue>
</Item>
</Items>
</Order></code></pre><H2 id="toc-hId-640946334">Result</H2><UL><LI>Custom Header +</LI><LI>Attachment +</LI><LI>String Properties in the text log created</LI></UL><P><span class="lia-unicode-emoji" title=":information:">ℹ️</span>It will also create the following output under https://<cpi-ui>/shell/monitoring/SystemLogs</P><pre class="lia-code-sample language-markup"><code>2026-07-17 14:55:17#+0000#ERROR#com.sap.esb.camel.route.policy.SingletonExchangeSelectionPolicy#anonymous#1784300116738-Blog_Xslt_Functions_Worker-1#com.sap.esb.camel.quartz.camel.route.policy#na#na#na#na#[INFO] MPL: AGpaQlWi5X9iHy9FgbgPV5XNRkVS ; Acquired lock: a6fa451d-daa0-4d18-94af-81c9d8d6897c_RONCE_1492 to start route: route34#-#10.0.201.0#0
<trace saxon-version="9.9.1.6" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<source node="/" line="0" file="">
<rule match="document-node()" line="27" module="XSLTMapping1.xsl">
totalQuantity BEFORE /Order/Items[1]/Item[1]/Quantity[1]/text()[1]: 50
totalQuantity BEFORE /Order/Items[1]/Item[3]/Quantity[1]/text()[1]: 175
itemCount BEFORE /Order/Items[1]/Item[1]: 1
itemCount BEFORE /Order/Items[1]/Item[4]: 4
itemCount BEFORE /Order/Items[1]/Item[2]: 2
totalQuantity BEFORE /Order/Items[1]/Item[2]/Quantity[1]/text()[1]: 75
itemCount BEFORE /Order/Items[1]/Item[3]: 3
totalQuantity BEFORE /Order/Items[1]/Item[4]/Quantity[1]/text()[1]: 185
</source><!-- /Order/Items[1]/Item[2] -->
</rule>
</source><!-- /Order/Items[1]/Item[1] -->
<source node="/Order/Items[1]/Item[1]" line="-1" file="">
</rule>
<rule match="element(Q{}Item)" line="136" module="XSLTMapping1.xsl">
<rule match="element(Q{}Item)" line="136" module="XSLTMapping1.xsl">
<source node="/Order/Items[1]/Item[2]" line="-1" file="">
<source node="/Order/Items[1]/Item[3]" line="-1" file="">
<rule match="element(Q{}Item)" line="136" module="XSLTMapping1.xsl">
<source node="/Order/Items[1]/Item[4]" line="-1" file="">
<rule match="element(Q{}Item)" line="136" module="XSLTMapping1.xsl">
</rule>
</trace>
</source><!-- / -->
</source><!-- /Order/Items[1]/Item[4] -->
</rule>
</rule>
</source><!-- /Order/Items[1]/Item[3] --></code></pre><HR /><P>If you found this article helpful, please leave a <STRONG>Like</STRONG>! You can also enjoy reading other community contributions and stay up to date by browsing <A href="https://search.sap.com/search.html?isu_context=community&isu_page=1&force_is=true&isu_keyword=cpi&isu_order=Latest&isu_filter=SAP+Managed+Tag%3ACloud+Integration%7CDocument+Type%3ABlog+Post" target="_blank" rel="noopener noreferrer">SAP Cloud Integration Blog Posts</A>.</P><P> </P>2026-07-20T12:05:03.993000+02:00https://community.sap.com/t5/sap-cap-blog-posts/building-cpi-explorer-my-journey-to-simplify-searching-sap-integration/ba-p/14439630Building CPI Explorer – My Journey to Simplify Searching SAP Integration Suite iFlows2026-07-20T12:12:08.365000+02:00lokesh_bhukyahttps://community.sap.com/t5/user/viewprofilepage/user-id/1585211<H1 id="toc-hId-1690204573">Building CPI Explorer – My Journey to Simplify Searching SAP Integration Suite iFlows</H1><H2 id="toc-hId-1622773787">Introduction</H2><P>As an SAP Integration Suite consultant, a large part of my day involves supporting existing integrations, troubleshooting production issues, and understanding how different systems are connected. One challenge kept coming up repeatedly: finding where a particular SFTP directory, HTTP endpoint, ProcessDirect endpoint, or credential was configured across dozens (sometimes hundreds) of Integration Flows.</P><P>SAP's Design-Time APIs let you retrieve Integration Packages and Integration Flows, but there's no built-in way to search adapter configurations across an entire tenant. In practice, that meant opening package after package and manually inspecting each iFlow — slow, repetitive, and easy to get wrong in a large landscape.</P><P>Instead of continuing to do this by hand, I decided to build a tool to solve it for myself, and hopefully for other developers too.</P><H2 id="toc-hId-1426260282">Where It All Started</H2><P>I started my career as an ABAP developer, and one feature I relied on constantly was the "Where Used" list. If I needed to know where a table, function module, or field was being used, I could just look it up. It was simple, fast, and always available.</P><P>When I moved into PI/PO and later CPI, that convenience disappeared. There's no equivalent way to instantly search where something is used across your integration landscape.</P><P>This became a real problem in day-to-day support. An FICO or SD colleague would come to me and say "my file isn't moving, can you check?" Half the time, they weren't even sure whether their interface was flowing through PI/CPI at all — they just knew something was stuck and assumed I'd know where to look. Other times, someone from the infra team would ask "are we using this host anywhere? We need to update it" or "can you find every flow using this username, we're rotating credentials." Each of these meant manually opening iFlow after iFlow, hoping I didn't miss one.</P><P>That's where the idea for CPI Explorer actually came from — not as a big architectural vision, but as a way to get back something as basic as the ABAP "Where Used" list, just for CPI.</P><P>One real example was during an infrastructure change where we had to update an SFTP host. Before CPI Explorer, the only option was to manually open multiple Integration Flows and inspect every SFTP adapter. With CPI Explorer, I can simply search for the hostname and immediately see every Integration Flow that references it.</P><H2 id="toc-hId-1229746777">The Idea</H2><P>The question I started with was simple:</P><P> </P><DIV><DIV><STRONG> Can I build a "Where Used" list for CPI?</STRONG></DIV></DIV><P class="">I spent quite some time exploring the SAP Business Accelerator Hub and Design-Time APIs to see whether this functionality already existed. The Design-Time APIs gave me metadata, but not the adapter-level detail I needed. So I went a level deeper: download each Integration Flow artifact, extract the <CODE>.iflw</CODE> file, parse the XML, and build a local searchable index from it.</P><P class="">Once that was working, I wrapped it in a Chrome Extension so I could search directly from the browser instead of running scripts every time.</P><H2 id="toc-hId-1033233272">How CPI Explorer Works</H2><P>At a high level, the tool:</P><UL><LI>Authenticates with SAP Integration Suite using OAuth</LI><LI>Retrieves Integration Packages and Integration Flows via the Design-Time APIs</LI><LI>Downloads Integration Flow artifacts</LI><LI>Extracts and parses the <CODE>.iflw</CODE> XML files</LI><LI>Builds a searchable metadata index</LI><LI>Lets you search adapter properties from the Chrome Extension</LI></UL><P>It currently supports searching for:</P><UL><LI>SFTP directories</LI><LI>Host names</LI><LI>HTTP endpoints</LI><LI>ProcessDirect endpoints</LI><LI>JMS queues</LI><LI>Credentials</LI><LI>Externalized parameters</LI><LI>Other adapter properties</LI></UL><H2 id="toc-hId-836719767">What I Learned</H2><P>Building this taught me more than I expected about:</P><UL><LI>SAP Integration Suite Design-Time APIs</LI><LI>The structure of Integration Flow artifacts</LI><LI>Parsing <CODE>.iflw</CODE> XML files</LI><LI>Chrome Extension development</LI><LI>Organizing a Node.js application into reusable modules</LI></UL><P>The trickiest part was making sure every downloaded artifact mapped back correctly to its source Integration Flow while the index was being built. Getting that mapping right was what made the search results trustworthy across a whole tenant.</P><H2 id="toc-hId-640206262">Why I'm Sharing This</H2><P>I built CPI Explorer to solve my own problem, but I believe many SAP Integration Suite developers face the same challenge. That's why I decided to make it open source, so others can use it, contribute ideas, and help improve it over time.</P><H2 id="toc-hId-443692757">GitHub</H2><P>The project is available here: <STRONG><A href="https://github.com/lokeshbhukya2019-netizen/cpi-explorer" target="_blank" rel="noopener nofollow noreferrer">https://github.com/lokeshbhukya2019-netizen/cpi-explorer</A></STRONG></P><P>Feedback, suggestions, and contributions are welcome.</P><H2 id="toc-hId-247179252">What's Next</H2><P>A few things I'm planning to add:</P><UL><LI>Search by adapter type</LI><LI>Multi-tenant support</LI><LI>Export to Excel/CSV</LI><LI>Dependency visualization</LI><LI>Support for additional adapter types</LI></UL><P>If you have ideas for other useful features, I'd like to hear them.</P><H2 id="toc-hId-50665747">Closing Thoughts</H2><P>CPI Explorer started as an attempt to fix a problem I ran into constantly in day-to-day SAP Integration Suite work. Along the way it turned into a good excuse to learn more about SAP's APIs, artifact structures, and browser extension development.</P><P>I hope it saves other SAP Integration Suite developers some time during troubleshooting and impact analysis. If you try it, I'd genuinely like to hear how it goes.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-07-10 031749.png" style="width: 721px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432614i4A9B3462B2B87055/image-size/large?v=v2&px=999" role="button" title="Screenshot 2026-07-10 031749.png" alt="Screenshot 2026-07-10 031749.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-07-10 024832.png" style="width: 557px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432612i2B1DD0E9BD52910B/image-size/large?v=v2&px=999" role="button" title="Screenshot 2026-07-10 024832.png" alt="Screenshot 2026-07-10 024832.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-07-10 031943.png" style="width: 559px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432613iE4BF543F79FB6D8B/image-size/large?v=v2&px=999" role="button" title="Screenshot 2026-07-10 031943.png" alt="Screenshot 2026-07-10 031943.png" /></span></P><P>Thank you for taking the time to read about CPI Explorer. If you try it out, I'd love to hear your feedback, suggestions, or ideas for new features. I hope it helps make troubleshooting and impact analysis in SAP Integration Suite a little easier for the community.</P><P><STRONG>Happy integrating!</STRONG></P>2026-07-20T12:12:08.365000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/migrate-from-sap-neo-cloud-integration-to-sap-integration-suite-with/ba-p/14444896Migrate from SAP Neo, Cloud Integration to SAP Integration Suite with Confidence2026-07-21T07:25:54.126000+02:00CarolZhanghttps://community.sap.com/t5/user/viewprofilepage/user-id/957<P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="SAP Community Blog Banners (Public) (1).png" style="width: 960px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435281i72D92B8857481754/image-size/large?v=v2&px=999" role="button" title="SAP Community Blog Banners (Public) (1).png" alt="SAP Community Blog Banners (Public) (1).png" /></span></P><P>Migrating from SAP Cloud Integration in the Neo environment to SAP Integration Suite on SAP BTP Cloud Foundry can raise many questions. <SPAN>To help you navigate this transition, we've published a comprehensive guide that brings together SAP documentation, best practices, and SAP support services to support every stage of your migration journey.</SPAN></P><H3 id="toc-hId-1949146691">What You'll Learn</H3><P class=""><SPAN>This guide walks you through the migration following the </SPAN><STRONG><SPAN>SAP Activate methodology</SPAN></STRONG><SPAN>, covering every phase from planning to post-go-live optimization:</SPAN></P><UL><LI><STRONG><SPAN>Discover</SPAN></STRONG><SPAN> – Understand why SAP BTP Cloud Foundry is the strategic direction and explore the benefits of SAP Integration Suite.</SPAN></LI><LI><STRONG><SPAN>Prepare</SPAN></STRONG><SPAN> – Assess your existing integration landscape and learn how the free </SPAN><STRONG><SPAN>Neo Sunset Migration Factory</SPAN></STRONG><SPAN> can help you create a migration roadmap.</SPAN></LI><LI><STRONG><SPAN>Explore</SPAN></STRONG><SPAN> – Discover onboarding resources, hands-on workshops, consulting services, and best practices to accelerate your migration.</SPAN></LI><LI><STRONG><SPAN>Realize & Deploy</SPAN></STRONG><SPAN> – Learn about SAP migration tools, Postman collections, testing strategies, and cutover recommendations for a successful go-live.</SPAN></LI><LI><STRONG><SPAN>Run</SPAN></STRONG><SPAN> – Optimize and monitor your integration landscape with SAP Cloud ALM, Continuous Quality Checks (CQC), Cloud Application Services (CAS), and Expert-Guided Implementations.</SPAN></LI></UL><H3 id="toc-hId-1752633186"><SPAN>How This Guide Helps</SPAN></H3><P><SPAN>Whether you're just starting your migration planning or already executing your project, this article brings together key information on:</SPAN></P><UL><LI><SPAN>Official SAP migration resources</SPAN></LI><LI><SPAN>Available SAP Enterprise Support services</SPAN></LI><LI><SPAN>Adoption and enablement offerings</SPAN></LI><LI><SPAN>SAP Consulting services</SPAN></LI><LI><SPAN>Best practices for reducing migration risk and accelerating time-to-value</SPAN></LI></UL><H3 id="toc-hId-1556119681"><SPAN>Access the Guide</SPAN></H3><P><SPAN>Explore this guide "<A title="How to Migrate from SAP Neo, Cloud Integration to SAP Integration Suite through Support Services" href="https://community.sap.com/t5/sap-business-technology-platform-value-map/how-to-migrate-from-sap-neo-cloud-integration-to-sap-integration-suite/ta-p/14426089" target="_blank">How to Migrate from SAP Neo, Cloud Integration to SAP Integration Suite through Support Services" </A>on the <A href="https://community.sap.com/t5/sap-business-technology-platform-value-map/gh-p/btp-vm" target="_blank">SAP Business Technology Platform Value Map</A>. To access <A href="https://community.sap.com/t5/sap-enterprise-support-value-maps/ct-p/es" target="_blank">Value Map Groups</A>, you need to login to the SAP Community using an S-user ID or a Universal ID.</SPAN></P><H5 id="toc-hId-1617771614"><FONT color="#000000"><STRONG><SPAN>Enhance Your SAP Experience with Value Maps </SPAN></STRONG><SPAN> </SPAN></FONT></H5><P><FONT color="#000000"><SPAN>Beyond this topic, SAP Enterprise Support value maps on SAP Community provides guidance, recommended actions, and supporting resources to help you decide what to focus on next—all included in your SAP cloud subscription.</SPAN></FONT></P><P><SPAN><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span></SPAN> Watch </SPAN><A href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_n9gri9t0" target="_blank" rel="noopener nofollow noreferrer">short demo video</A><SPAN>, then head over to </SPAN><A href="https://pages.community.sap.com/resources/enterprise-support-value-maps" target="_blank" rel="noopener noreferrer">our page</A><SPAN> - explore our range of topics and </SPAN><A href="https://forms.office.com/Pages/ResponsePage.aspx?id=bGf3QlX0PEKC9twtmXka9wYnhDAeiNtCufwRckBCmq1UNUpFVElUN1JFVkZOSFpINUoyRUVFVlVPVyQlQCN0PWcu" target="_blank" rel="noopener nofollow noreferrer">request a call</A><SPAN> </SPAN><STRONG>with a topic expert</STRONG><SPAN> for guidance tailored to your goals. </SPAN><SPAN> </SPAN></P><P> </P><P><FONT color="#000000"><STRONG><SPAN>About the author: </SPAN></STRONG><SPAN> </SPAN></FONT></P><P>Carol Zhang is a Topic Expert for SAP Enterprise Support value maps, specializing in the SAP Business Technology Platform (BTP). With more than 20 years of experience at SAP and a background spanning roles in SAP Service and Support organization, she is passionate about helping customers succeed businesses accelerate the adoption of SAP BTP tools and services through SAP Enterprise Support offerings. </P>2026-07-21T07:25:54.126000+02:00https://community.sap.com/t5/integration-blog-posts/keystore-certificate-expiration-alerts-in-sap-integration-suite-part-2/ba-p/14431640Keystore Certificate Expiration Alerts in SAP Integration Suite - Part 22026-07-21T08:06:11.743000+02:00Kalyanidanthahttps://community.sap.com/t5/user/viewprofilepage/user-id/1399904<P><STRONG>Introduction</STRONG></P><P>Managing certificates is a responsibility for SAP Integration support team. Certificates stored in the Keystore are used to establish secure communication with external systems. If a certificate expires without notice, it can cause integration failures and business disruptions.</P><P>To avoid this, organizations often rely on manual monitoring, which is time-consuming and prone to oversight.</P><P>In this blog, I would like to explain- how to build an automated monitoring solution in SAP Integration Suite:</P><UL><LI>Retrieves all certificates from the tenant Keystore using the OData API.</LI><LI>Filters certificates approaching expiration using a Groovy script.</LI><LI>Converts the filtered data into a well-formatted HTML table using XSLT.</LI><LI>Sends an email notification automatically through the Mail Adapter.</LI></UL><P><STRONG>CPI Design:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kalyanidantha_0-1783937878897.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432289iE80EB71F710E271C/image-size/large?v=v2&px=999" role="button" title="Kalyanidantha_0-1783937878897.png" alt="Kalyanidantha_0-1783937878897.png" /></span></P><H3 id="toc-hId-1948131714"><STRONG>The integration consists of the following steps:</STRONG></H3><TABLE width="845px"><TBODY><TR><TD width="186.903px" height="50px"><P><STRONG>Step</STRONG></P></TD><TD width="657.49px" height="50px"><P><STRONG>Description</STRONG></P></TD></TR><TR><TD width="186.903px" height="50px"><P>Timer</P></TD><TD width="657.49px" height="50px"><P>To start the Integration once a day</P></TD></TR><TR><TD width="186.903px" height="50px"><P>ContentModifier</P></TD><TD width="657.49px" height="50px"><P>Externalized properties such as sender, receiver email addresses and selection of days to check in expiry</P></TD></TR><TR><TD width="186.903px" height="50px"><P>Request Reply</P></TD><TD width="657.49px" height="50px"><P>Calls the CI OData API to retrieve Keystore certificates.</P></TD></TR><TR><TD width="186.903px" height="77px"><P class="lia-align-left" style="text-align : left;">Filter Expired Certificates</P></TD><TD width="657.49px" height="77px"><P>Uses a Groovy script to identify certificates expiring within the configured notification period.</P></TD></TR><TR><TD width="186.903px" height="50px"><P class="lia-align-left" style="text-align : left;">Router</P></TD><TD width="657.49px" height="50px"><P>Check if there are records in the body. Continue If yes. End the message if not.</P></TD></TR><TR><TD width="186.903px" height="50px"><P>XSLT Mapping</P></TD><TD width="657.49px" height="50px"><P>Transform the XML response into an HTML table.</P></TD></TR><TR><TD width="186.903px" height="50px"><P>Mail Adapter</P></TD><TD width="657.49px" height="50px"><P>To Send the formatted HTML email notification.</P></TD></TR><TR><TD><P>ContentModifier</P></TD><TD><P>Prepares the xml Body incase of an error</P></TD></TR><TR><TD><P>Send with Mail Adapter</P></TD><TD><P>Send the error info to the operation teams in case of an error</P></TD></TR></TBODY></TABLE><P><STRONG> Timer:<BR /></STRONG>A simple time schedule to run once a day.<BR /><STRONG>Content Modifier:<BR /></STRONG><SPAN>It stores the sender and receiver email addresses as exchange properties. These properties are later referenced in the Mail Adapter configuration, making the integration easier to maintain.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kalyanidantha_1-1782927072813.png" style="width: 563px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428339i87995F48FBFE29AB/image-dimensions/563x214?v=v2" width="563" height="214" role="button" title="Kalyanidantha_1-1782927072813.png" alt="Kalyanidantha_1-1782927072813.png" /></span></P><P><STRONG>Configure the OData Receiver Adapter: <BR /></STRONG>The OData Receiver Adapter is used to retrieve all certificate entries from the SAP Integration Suite Keystore using the Integration Suite OData API.</P><P>The API returns details such as:</P><UL><LI>Certificate Alias</LI><LI>Key Type</LI><LI>Certificate Status</LI><LI>Certificate Expiration Date (ValidNotAfter)</LI></UL><P>Some Odata API's allows you to filter the records but for this KeyStore API entity, it is not a choice. So, the oData results are filtered later by the Groovy script. I have created an additional blog for consuming & testing the OData Services, please check out here if you need any assistance.</P><P><A title="Test Odata service using Postman" href="https://community.sap.com/t5/integration-blog-posts/consuming-sap-cpi-keystore-entries-via-security-content-odata-api-part-1/ba-p/14431624 " target="_self">Test Odata service using Postman</A> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kalyanidantha_2-1782929432708.png" style="width: 535px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428351i1F087F48B0600B53/image-dimensions/535x226?v=v2" width="535" height="226" role="button" title="Kalyanidantha_2-1782929432708.png" alt="Kalyanidantha_2-1782929432708.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kalyanidantha_3-1782927072820.png" style="width: 529px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428338i033471941B165EE2/image-dimensions/529x278?v=v2" width="529" height="278" role="button" title="Kalyanidantha_3-1782927072820.png" alt="Kalyanidantha_3-1782927072820.png" /></span></P><P>The integration invokes the SAP Integration Suite OData API to retrieve all certificates stored in the tenant's Keystore. A sample response looks like this:</P><PRE><KeystoreEntries><BR /> <KeystoreEntry><BR /> <Alias>smtp.gmail.com</Alias><BR /> <KeyType>EC</KeyType><BR /> <ValidNotAfter>2026-08-10T18:37:12.000</ValidNotAfter><BR /> <Status>unchanged</Status><BR /> </KeystoreEntry><BR /></KeystoreEntries></PRE><P>I have created another blog post for how to connect security content odata api using postman in-detail. in this blog</P><H6 id="toc-hId-2138866366"><STRONG>Filter Certificates xml data Using Groovy</STRONG></H6><P>Instead of implementing complex date calculations in graphical message mapping, I chose Groovy. The script compares the current date (+7 or +14days as needed) with the <STRONG>ValidNotAfter</STRONG> field and keeps only certificates that are due to expire within the configured notification window (for example, the next 14 days).<BR /><BR />This approach is simpler, easier to maintain, and provides greater flexibility when implementing date-based logic.</P><pre class="lia-code-sample language-javascript"><code>import com.sap.gateway.ip.core.customdev.util.Message
import groovy.xml.XmlUtil
def Message processData(Message message) {
def body = message.getBody(String)
def xml = new XmlParser().parseText(body)
Date today = new Date()
Date threshold = today + 14
xml.KeystoreEntry.findAll { cert ->
Date expiry = Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS", cert.ValidNotAfter.text() )
expiry <= threshold
}.each { }
xml.KeystoreEntry.findAll { cert ->
Date expiry = Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS", cert.ValidNotAfter.text())
!(expiry <= threshold)
}.each { it.parent().remove(it) }
message.setBody(XmlUtil.serialize(xml))
return message
}</code></pre><H6 id="toc-hId-1942352861"><STRONG>Router Configuration</STRONG></H6><P>Since certificate expiration is not a daily occurrence, there is no need to send an email every time the integration flow runs. Instead, a <STRONG>Router</STRONG> step is used to determine whether any certificates meet the alert criteria.</P><P>I configured the Router to evaluate the groovy output step. If one or more certificates are approaching their expiration date, the message is routed to the <STRONG>Mail Receiver Adapter</STRONG> to send an email notification. Otherwise, the flow simply ends without sending any email.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kalyanidantha_0-1782997155452.png" style="width: 515px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428535i728B5B6C23A032E6/image-dimensions/515x251?v=v2" width="515" height="251" role="button" title="Kalyanidantha_0-1782997155452.png" alt="Kalyanidantha_0-1782997155452.png" /></span></P><H6 id="toc-hId-1745839356"><STRONG>Generate an HTML Table Using XSLT</STRONG></H6><P>The filtered XML is transformed into an HTML table using XSLT. Inline HTML styles are used to ensure the table is displayed correctly in email clients such as Outlook and Gmail.</P><P>The generated email contains:</P><UL><LI>Certificate Name</LI><LI>Key Type</LI><LI>Valid Until</LI><LI>Status</LI></UL><pre class="lia-code-sample language-markup"><code><?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<body style="font-family:Arial,Helvetica,sans-serif;font-size:13px;">
<xsl:choose>
<xsl:when test="count(/KeystoreEntries/KeystoreEntry) > 0">
<h2>Certificates Expiring Soon</h2>
<table border="1" cellpadding="6" cellspacing="0" width="100%" style="border-collapse:collapse;border:1px solid #000000;">
<tr bgcolor="#D9D9D9">
<th style="border:1px solid #000000;text-align:left;">Certificate Name</th>
<th style="border:1px solid #000000;text-align:left;">Key Type</th>
<th style="border:1px solid #000000;text-align:left;">Valid Until</th>
<th style="border:1px solid #000000;text-align:left;">Status</th>
</tr>
<xsl:for-each select="/KeystoreEntries/KeystoreEntry">
<tr>
<td style="border:1px solid #000000;">
<xsl:value-of select="Alias"/>
</td>
<td style="border:1px solid #000000;">
<xsl:value-of select="KeyType"/>
</td>
<td style="border:1px solid #000000;">
<xsl:value-of select="ValidNotAfter"/>
</td>
<td style="border:1px solid #000000;">
<xsl:value-of select="Status"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:when>
<xsl:otherwise>
<h2>No certificates found.</h2>
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>
</xsl:stylesheet></code></pre><P> <STRONG>Mail Adapter Configuration :<BR /> </STRONG>To ensure the HTML content is rendered correctly by email clients, configure the following settings in the Mail Adapter:</P><pre class="lia-code-sample language-abap"><code>Mime Type: Text/HTML
Content Encoding: Quoted-Printable</code></pre><P><SPAN>These settings instruct the mail client to interpret the message body as HTML rather than plain text. As a result, the certificate information is displayed in a well-formatted table instead of showing the raw HTML tags.<BR /><BR />Another blog for explaining how to create Gmail app password, please check out here if you need any assistance.<BR /><A title="Gmail SMTP Integration" href="https://community.sap.com/t5/technology-blog-posts-by-members/cpi-gmail-smtp-integration/ba-p/13457193" target="_self">Gmail SMTP Integration</A> <BR /><BR /></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kalyanidantha_4-1782927072823.png" style="width: 516px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428341i785FB7BBB97C79F4/image-dimensions/516x281?v=v2" width="516" height="281" role="button" title="Kalyanidantha_4-1782927072823.png" alt="Kalyanidantha_4-1782927072823.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kalyanidantha_5-1782927792162.png" style="width: 514px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428342i9AD71CA04F0B3CDA/image-dimensions/514x436?v=v2" width="514" height="436" role="button" title="Kalyanidantha_5-1782927792162.png" alt="Kalyanidantha_5-1782927792162.png" /></span></P><P><STRONG>Email notification: <BR /></STRONG>After the integration flow is executed successfully, an email notification is sent containing the list of certificates that meet the configured criteria (for example, certificates approaching their expiration date).</P><P>The HTML formatting makes the report easy to read, allowing administrators to quickly identify certificates that require attention without manually checking the SAP Integration Suite tenant.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kalyanidantha_4-1782929820830.png" style="width: 641px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428353i7126C0D9726ADDA3/image-dimensions/641x149?v=v2" width="641" height="149" role="button" title="Kalyanidantha_4-1782929820830.png" alt="Kalyanidantha_4-1782929820830.png" /></span></P><P><STRONG>Exception Handling</STRONG></P><P>To improve the integration error handling, an Exception Subprocess is added. If an error occurs during the execution of the iFlow—such as an API connection issue, authentication failure, or processing error—the Exception Subprocess is triggered automatically.</P><P>The Exception Subprocess sends an email notification containing the error details to the configured recipients. This enables the team to quickly identify and resolve issues without manually monitoring the integration flow, helping ensure timely response to failures.</P><P><STRONG>Content Modifier</STRONG> : Below is the body i used </P><pre class="lia-code-sample language-markup"><code><?xml version="1.0" encoding="UTF-8" ?>
<AlertNotification>
<item>
<Sender>SAP CPI</Sender>
<Receiver>Mail</Receiver>
<SenderInterface>QueryKeystoreEntries_Out</SenderInterface>
<ReceiverInterface>AlertNotification_In</ReceiverInterface>
<IFlowName>${camelId}</IFlowName>
<Application_ID>${header.SAP_ApplicationId}</Application_ID>
<Correlation_ID>${header.SAP_MplCorrelationId}</Correlation_ID>
<Message_ID>${property.SAP_MessageProcessingLogID}</Message_ID>
<StartedAt>${header.SAP_ApplicationStopTime}</StartedAt>
<CurrentDateTime>${date:now:dd-MM-yyyy HH:mm:ss}</CurrentDateTime>
<TenantName>${property.SystemName}</TenantName>
<Error>${exception.message}</Error>
<OverallStatus>${header.SAP_ApplicationOverallStatus}</OverallStatus>
<LatestActionAt>${header.SAP_ApplicationStartTime}</LatestActionAt>
<CreatedTimestamp>${property.CamelCreatedTimestamp}</CreatedTimestamp>
<ExceptionCaught>${property.CamelExceptionCaught}</ExceptionCaught>
<HttpResponseCode>${header.CamelHttpResponseCode}</HttpResponseCode>
<severity>INFO</severity>
<category>NOTIFICATION</category>
</item>
</AlertNotification></code></pre><H4 id="toc-hId-1291160413"><SPAN><BR /><BR />Benefits:</SPAN></H4><P class=""><SPAN>This solution provides several advantages:</SPAN></P><UL><LI><SPAN>Automated certificate monitoring.</SPAN></LI><LI><SPAN>Early notification before certificate expiration.</SPAN></LI><LI><SPAN>Reduced manual effort.</SPAN></LI><LI><SPAN>Configurable notification period.</SPAN></LI><LI><SPAN>Reusable design for other monitoring scenarios, for ex. you can report the message processing logs</SPAN></LI><LI><SPAN>Readability through HTML email formatting.</SPAN></LI></UL><P> </P>2026-07-21T08:06:11.743000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/beyond-the-standard-developing-the-quot-cpi-kafka-adapter-plus-quot-for/ba-p/14444942Beyond the Standard: Developing the "CPI Kafka Adapter Plus" for High-Volume Event Streaming2026-07-21T08:17:30.796000+02:00Florian_Kubehttps://community.sap.com/t5/user/viewprofilepage/user-id/2566<P>Hello everyone!</P><P>I’m Florian Kube. When I look back at my career, I’ve been working in the SAP integration space for over 10 years now. I briefly started with SAP PI/PO, but jumped straight onto HCI (now SAP Integration Suite) as soon as it became available - all the way back when we still had to configure flows using the Eclipse plugin.</P><P>In recent years, the integration landscape has shifted. Synchronous request-response setups are increasingly replaced by modern, event-driven architectures. Event-driven integration and streaming are no longer just buzzwords; they are part of our daily work now. And when we talk about streaming in the enterprise space, the conversation almost always leads to Apache Kafka (next to SAP Advanced Event Mesh<SPAN> </SPAN><SPAN class="lia-unicode-emoji"><span class="lia-unicode-emoji" title=":winking_face:">😉</span></SPAN>).</P><P>In theory, both Apache Kafka and SAP Cloud Integration (CPI) are built to process messages immediately and in real-time. That is the core beauty of event-driven design. However, when we apply this high-frequency, single-message pattern directly to CPI in high-volume enterprise environments, we quickly run into practical operational and performance challenges.</P><P>To solve these practical challenges, I started an open-source project: the<SPAN> </SPAN><STRONG>CPI Kafka Adapter Plus</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="logo.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435304iD247546854A28CA3/image-size/large?v=v2&px=999" role="button" title="logo.png" alt="logo.png" /></span></P><H3 id="toc-hId-1949147493"> <SPAN>High-Frequency Events Meet Operational Reality</SPAN></H3><P>When systems exchange data, enterprise architectures often use bulk processing. However, when handling high-frequency events or large data streams in CPI, treating every single event as an individual integration transaction creates major operational issues:</P><OL><LI><P><STRONG>MPL Overload & The Logging Dilemma:</STRONG><SPAN> </SPAN>When consuming events individually, every single event processed by CPI creates its own Message Processing Log (MPL). To handle this in high-volume scenarios, you<SPAN> </SPAN><EM>could</EM><SPAN> </SPAN>set the log level to "Error Only". But let's be honest: in daily operations, that often feels like flying blind. It frequently leads to misunderstandings and troubleshooting difficulties because you lose all visibility on successful processing. On the other hand, keeping standard logs turned on with high message volumes can overload the database, degrade performance, and clutter your monitoring.</P></LI><LI><P><STRONG>Downstream System Overload:</STRONG><SPAN> </SPAN>Even if CPI can ingest thousands of high-frequency events without issues, the receiving target system (like an ERP database or a legacy API) often cannot. Flooding a downstream system with thousands of individual, tiny requests can easily overwhelm it. Gathering these events into structured packages is often a technical necessity to protect downstream systems.</P></LI><LI><P><STRONG>Cost Efficiency (And how SAP counts messages):</STRONG><SPAN> </SPAN>In SAP Integration Suite, licensing is billed per processed message, where each 250KB of payload counts as one message. If you push 1,000 tiny single-event messages (even if they are only 1KB each) through CPI, SAP counts and bills this as 1,000 messages. However, if you bundle those 1,000 events into a single 1MB bulk package, it is processed as a single transaction and, based on the 250KB rule, only counts as 4 messages! Processing unbatched, high-frequency single events is an area where you can save a lot of money with the right optimization.</P></LI></OL><H3 id="toc-hId-1725039803" id="toc-hId-1752633988">The Previous Workaround</H3><P>To optimize this, integration developers often have to build workarounds. For example, when a sending system like SAP's Data Replication Framework (DRF) sends business objects as a bulk payload, the standard Kafka adapter cannot automatically split this bulk into individual Kafka records.</P><P>As a workaround, developers have to build tedious splitter logic in the Integration Flow to split the bulk and send every single message individually to Kafka. While this works, it bloats the integration flows with unnecessary processing steps, forces CPI into long processing loops, and generates very large log files.</P><H2 id="toc-hId-1399443579" id="toc-hId-1427037764">An Adapter to Bridge the Gap</H2><P>Why not move this efficiency logic directly into the adapter? The goal was to build a custom adapter that respects Kafka’s native streaming design while protecting CPI’s operational and monitoring boundaries.</P><P>The CPI Kafka Adapter Plus was designed to:</P><UL><LI><P>Support native batching directly out of the box.</P></LI><LI><P>Keep integration flows clean by avoiding complex splitters and aggregators.</P></LI><LI><P>Drastically reduce the CPI resource footprint and MPL count without having to resort to restrictive "Error Only" logging.</P></LI></UL><H3 id="toc-hId-1332012793" id="toc-hId-1359606978">Accelerating Adapter Development with AI</H3><P>As an Integration Architect, my core focus is on system design, architecture, and orchestration, rather than spending days writing raw Java boilerplate.</P><P>Developing a custom adapter for SAP CPI requires working with the Adapter Development Kit (ADK). While the ADK is highly powerful, it is also a proprietary, specialized framework with a steep learning curve. Finding extensive community examples or templates for complex ADK implementations is incredibly difficult.</P><P>Instead of letting this framework barrier slow me down, I treated Generative AI (Claude and GitHub Copilot) as my virtual pair-programmers. With a clear architectural blueprint in mind, this modern developer workflow allowed me to build the CPI Kafka Adapter Plus with maximum efficiency:</P><UL><LI><P><STRONG>Navigating the ADK Lifecycle:</STRONG><SPAN> </SPAN>I used Claude to clarify the underlying lifecycle methods of the ADK. I could describe the exact architectural behavior I wanted (such as holding a session open to collect messages in a custom thread before pushing them to the pipeline), and Claude translated these concepts into the structure required by the framework.</P></LI><LI><P><STRONG>Automating the Boilerplate:</STRONG><SPAN> </SPAN>I used GitHub Copilot to speed up the repetitive coding. It helped generate Maven configurations, set up properties, and draft unit tests. This kept me focused entirely on the core business and routing logic of the adapter.</P></LI><LI><P><STRONG>Resolving Complex Dependencies:</STRONG><SPAN> </SPAN>Merging Kafka client libraries, Avro schemas, and JSON validation libraries into the strict runtime environment of an SAP adapter can easily lead to classpath conflicts. AI helped me quickly troubleshoot these tricky packaging errors, saving hours of searching through legacy forums.</P></LI></UL><P>This experience showed me that with a strong architectural vision, modern AI tools can bridge the gap between design and implementation. It allowed me to deliver an enterprise-grade adapter without having to reinvent the wheel for every line of boilerplate code.</P><H2 id="toc-hId-1006416569" id="toc-hId-1034010754">What Can the "Kafka Adapter Plus" Do?</H2><P>The CPI Kafka Adapter Plus is not just a "Proof of Concept." It has already been running stable in production for months. Primarily in use cases involving massive amounts of data.</P><P>Of course, all of these features are completely modular and optional. You can use just a single capability or combine them however you like - whether you only need Avro serialization, only require bulk processing, or want to mix and match them depending on your specific integration requirements.</P><P>Here are the key features that helped bridge the gap between high-speed streaming and SAP CPI:</P><H3 id="toc-hId-938985783" id="toc-hId-966579968">1. Batching & Bulk Processing</H3><P>Whether you are sending bulk data to Kafka or consuming high-frequency events from it, the CPI Kafka Adapter Plus supports native batching in both directions:</P><UL><LI><P><STRONG>On the Receiver Side (sending to Kafka):</STRONG><SPAN> </SPAN>When business objects (like those from SAP DRF) arrive in CPI as a bulk, you no longer need to split them inside your flow. The adapter allows you to transform and hand over the bulk payload in a single step. The CPI Kafka Adapter Plus then automatically streams them to Kafka as native, individual records. This completely avoids tedious splitter or looping steps within the Integration Flow, preventing resource-heavy loops and drastically reducing transaction logging overhead.</P></LI><LI><P><STRONG>On the Sender Side (consuming from Kafka):</STRONG><SPAN> </SPAN>Instead of triggering thousands of individual Integration Flow executions (and thus thousands of individual MPLs) for every single Kafka event, the adapter can bundle incoming messages into a single bulk package. This dramatically reduces the MPL count, preserves tenant resources, and lowers the counted message volume, while still keeping your monitoring clean and manageable.</P></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Florian_Kube_1-1784614316967.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435299i8A3A83895A6D122C/image-size/medium?v=v2&px=400" role="button" title="Florian_Kube_1-1784614316967.png" alt="Florian_Kube_1-1784614316967.png" /></span></P><P> </P><H3 id="toc-hId-742472278" id="toc-hId-770066463">2. Dead Letter Topic Support</H3><P>When it comes to error handling, standard Kafka adapters often rely on simple retry loops. If a message is corrupt or cannot be processed, it triggers rapid retry cycles. Since the default retry interval is usually very short (often in the range of seconds), CPI gets stuck repeatedly processing the exact same failing message over and over again. Wasting valuable CPU resources and cluttering up your logs.</P><P>The CPI Kafka Adapter Plus offers Dead Letter Topic support. If processing a message fails, it can be cleanly routed to a defined Dead Letter Topic instead of looping infinitely, allowing the rest of the message stream to continue running uninterrupted.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Florian_Kube_2-1784614316959.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435300iCDA8671AF8ADD2D3/image-size/medium?v=v2&px=400" role="button" title="Florian_Kube_2-1784614316959.png" alt="Florian_Kube_2-1784614316959.png" /></span></P><P> </P><H3 id="toc-hId-545958773" id="toc-hId-573552958">3. Integrated Avro Serialization</H3><P>Anyone using Kafka professionally usually relies on Apache Avro for schema definition. Typically, achieving this in CPI requires making manual HTTP calls to an external Schema Registry and writing complex Groovy scripts to handle the serialization and deserialization. This approach is highly error-prone and unnecessarily bloats your Integration Flows.</P><P>The CPI Kafka Adapter Plus solves this by offering native Avro serialization right out of the box, completely eliminating the need for custom scripts and HTTP overhead in your message flow.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Florian_Kube_3-1784614316974.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435301iB83E4F40B8A15367/image-size/medium?v=v2&px=400" role="button" title="Florian_Kube_3-1784614316974.png" alt="Florian_Kube_3-1784614316974.png" /></span></P><P> </P><H3 id="toc-hId-349445268" id="toc-hId-377039453">4. JSON Validation</H3><P>The CPI Kafka Adapter Plus validates JSON payloads directly against predefined schemas. Both when sending and receiving messages. This means invalid data is caught and filtered out right at the adapter boundary, preventing corrupt payloads from ever entering and disrupting your CPI integration flows.</P><H2 id="toc-hId-23849044" id="toc-hId-51443229">Open Source: Try It Out and Join In!</H2><P>I firmly believe in the power of the SAP community. That’s why I decided to make the entire source code of the CPI Kafka Adapter Plus available as open source.</P><P>If you are facing similar challenges with mass data and Kafka in the SAP Integration Suite, I warmly invite you to try out the CPI Kafka Adapter Plus:</P><UL><LI><P><STRONG>GitHub Repository:</STRONG><SPAN> </SPAN><A title="null" href="https://github.com/FinkeFlo/cpi-kafka-adapter-plus" target="_blank" rel="noopener nofollow noreferrer">FinkeFlo/cpi-kafka-adapter-plus</A></P></LI><LI><P><STRONG>Documentation & Setup Guide:</STRONG><SPAN> </SPAN><A title="null" href="https://finkeflo.github.io/cpi-kafka-adapter-plus/" target="_blank" rel="noopener nofollow noreferrer">FinkeFlo GitHub Pages</A></P></LI></UL><P>I would love to get your feedback, feature requests, or even pull requests directly on GitHub. Let’s make the SAP integration world a little better and more efficient together!</P><P>How do you currently handle mass data challenges with Kafka in CPI? Let me know in the comments below!</P><P><STRONG>Best regards,</STRONG></P><P><STRONG>Florian</STRONG></P><P><FONT size="3"><STRONG>Disclaimer</STRONG>: This is an independent, community-driven open-source project. It is not an official SAP product, and is not officially supported or endorsed by SAP SE. Use at your own discretion.</FONT></P>2026-07-21T08:17:30.796000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/cloud-integration-activating-enterprise-messaging-capabilities-for-jms/ba-p/14442830Cloud Integration- Activating Enterprise Messaging Capabilities for JMS Queue - CF2026-07-21T10:55:46.838000+02:00Pavan_Koppula1https://community.sap.com/t5/user/viewprofilepage/user-id/1439449<H6 id="toc-hId--1958632222">When JMS-based integration flows fail to deploy on SAP Integration Suite (Cloud Foundry) with this error, it usually points to one thing: the Message Queue capability isn't activated on the tenant.</H6><P>In my current project IS got upgraded from Basic/Starter edition to Standard edition.</P><P>Recently we face an issue when I try to deploy the flow it’s getting failed to deploy.</P><H2 id="toc-hId-1623490693">The Error</H2><P>[CONTENT][CONTENT_DEPLOY][ERROR_MISSING_SERVICE_KEY] : Unable to connect to enterprise messaging service. Missing Service Key. Please check if enterprise messaging subscription is active</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Pavan_Koppula1_0-1784277285584.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434189iDBAC6CC4D3502135/image-size/medium?v=v2&px=400" role="button" title="Pavan_Koppula1_0-1784277285584.png" alt="Pavan_Koppula1_0-1784277285584.png" /></span></P><P> </P><H2 id="toc-hId-1426977188">Root Cause</H2><P>A quick check under Monitor → Manage Stores confirms the root cause: there's no Message Queue tab at all, which means JMS/Enterprise Messaging was never activated on the tenant.</P><P>Message Queues (Enterprise Messaging) is a separate capability that must be explicitly enabled in Manage Capabilities. It is not switched on automatically — for example, an edition upgrade does not enable it by itself. Until it's active, any iFlow using the JMS adapter (or AS2/XI with JMS storage) will fail to deploy with this error.</P><H2 id="toc-hId-1230463683">Resolution</H2><OL><LI>Open Manage Capabilities from the tenant home page.</LI><LI>Message Queues will show as not enabled.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435432i4ADBCB0F69319D38/image-size/medium?v=v2&px=400" role="button" title="image.png" alt="image.png" /></span></P><P> </P><OL><LI>Click Edit.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435433iC129F58CFE961318/image-size/medium?v=v2&px=400" role="button" title="image.png" alt="image.png" /></span></P><P> </P><OL><LI>Enable Message Queues, then Save and OK.</LI><LI>Message Queues becomes visible under Monitor → Manage Stores, confirming activation.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Pavan_Koppula1_3-1784277310508.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434195iBFC5BC29D6AFBDA1/image-size/medium?v=v2&px=400" role="button" title="Pavan_Koppula1_3-1784277310508.png" alt="Pavan_Koppula1_3-1784277310508.png" /></span></P><P> </P><P>Redeploy the affected iFlows — the deployment now goes through without the service key error.</P><P><STRONG>Note: </STRONG><EM>Activating Message Queues triggers a tenant restart (a few minutes of downtime). Plan this during a maintenance window, and ensure no critical messages are in-flight, since processing can be interrupted during the restart. After activation, verify all iFlows come back up correctly and redeploy any that don't.</EM></P><H2 id="toc-hId-1033950178">Key Takeaway</H2><P>The error message suggests a credentials problem, but it's really a missing capability. If you hit this error, check Manage Capabilities before troubleshooting service keys or destinations.</P><P>Activating JMS is a simple, well-known step for most of us. But this error doesn't read like a JMS issue at all — it points to a service key/enterprise messaging service problem. The actual issue is JMS, just not obvious from the message. I'm writing this post to fill that gap on same search.</P><P> </P>2026-07-21T10:55:46.838000+02:00https://community.sap.com/t5/integration-blog-posts/groovy-in-your-sap-cloud-integration-iflows-is-application-code-here-is/ba-p/14446344Groovy in your SAP Cloud Integration iFlows is application code. Here is what to check.2026-07-22T13:23:13.293000+02:00vahagnhttps://community.sap.com/t5/user/viewprofilepage/user-id/760188<P>As PI/PO approaches the end of mainstream maintenance in 2027, most of us are moving<BR />integration onto SAP Integration Suite / Cloud Integration. In the process, a lot of<BR />custom logic ends up in Groovy script steps. And a Groovy script step is not a mapping<BR />expression: it is full application code running on the tenant. It can run OS commands,<BR />open sockets, read the filesystem and handle credentials.</P><P>That makes iFlow scripts a real security surface, and one that most SAP security reviews<BR />still skip. Below are the patterns worth checking in your own script steps, with small<BR />examples.</P><H2 id="toc-hId-1820118592">1. OS command execution from message data</H2><P>A classic mistake is building a shell command out of a header or payload field:</P><pre class="lia-code-sample language-java"><code>def name = message.getHeaders().get("X-Document-Name")
def out = ["/bin/sh", "-c", "process " + name].execute().text</code></pre><P>If `X-Document-Name` is attacker controlled, so is the command. Avoid `.execute()`,<BR />`Runtime.exec` and `ProcessBuilder` on anything derived from the message. If you truly<BR />need a process call, pass a fixed argument array and validate every value against an<BR />allow list.</P><H2 id="toc-hId-1623605087">2. XXE in XML parsing</H2><P>`XmlSlurper` and `XmlParser` resolve DTDs and external entities by default:</P><pre class="lia-code-sample language-java"><code>def xml = new XmlSlurper().parse(
new ByteArrayInputStream(message.getBody(byte[].class)))</code></pre><P>A crafted payload can read local files or reach internal endpoints. Disable DTDs and<BR />external entities explicitly:</P><pre class="lia-code-sample language-java"><code>def parser = new XmlSlurper()
parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
parser.setFeature("http://xml.org/sax/features/external-general-entities", false)</code></pre><H2 id="toc-hId-1427091582">3. Path traversal on file names</H2><pre class="lia-code-sample language-java"><code>def name = message.getHeaders().get("X-Document-Name")
new File("/tmp/inbound/" + name).text = body</code></pre><P>A value like `../../somewhere` breaks out of the intended folder. Normalize the path and<BR />confirm it still sits under the base directory before writing.</P><H2 id="toc-hId-1230578077">4. Hardcoded secrets and disabled TLS checks</H2><P>Credentials pasted into a script step, or a client that turns off certificate or hostname<BR />verification to "make it work", both survive far longer than anyone intends. Use the<BR />Security Material store for secrets, and never disable TLS verification in production<BR />scripts.</P><H2 id="toc-hId-1034064572">5. Sensitive data in the message log</H2><pre class="lia-code-sample language-java"><code>messageLog?.setStringProperty("payload", message.getBody(String.class))</code></pre><P>Convenient for debugging, but full payloads can carry PII, tokens or bank data straight<BR />into logs that a wider group can read. Log identifiers, not bodies.</P><H2 id="toc-hId-837551067">Why this matters</H2><P>None of this is exotic. It is the same class of issue we already scan for in custom ABAP,<BR />just moved to a new runtime and a new language. The problem is that it is spread across<BR />many iFlows and rarely reviewed line by line.</P><P>We built a scanner for exactly this at RedRays. It connects to your Integration Suite<BR />runtime, pulls the iFlow content and statically analyzes each Groovy, JavaScript and XSLT<BR />script step for the issues above, returning a CVSS score and the exact file and line, in<BR />the same console as our ABAP scans.</P><P>> **Disclosure:** I work at RedRays, so treat this paragraph as vendor context, not a<BR />> neutral recommendation. The checklist above stands on its own and you can apply it by<BR />> hand or with any tool you prefer.</P><P>If you have run into other risky Groovy patterns in CPI, I would like to hear them in the<BR />comments so we can build a fuller list for the community.</P>2026-07-22T13:23:13.293000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/from-a-prompt-to-a-working-sap-integration-suite-iflow/ba-p/14446705From a prompt to a working SAP Integration Suite iFlow2026-07-22T21:01:06.037000+02:00MarianVatafuhttps://community.sap.com/t5/user/viewprofilepage/user-id/864725<H1 id="toc-hId-1691039594">Introduction</H1><P class="">Creating an <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/getting-started-with-integration-flow-development?locale=en-US" target="_self" rel="noopener noreferrer">integration flow</A> takes time even when the business logic is simple. The work is not only drawing the happy path. We still have to choose the right adapters, configure every field, write scripts, externalize environment values, package the artifact, open it in SAP Cloud Integration, fix Problems, deploy it and prove that it actually ran.</P><P class="">We wanted to see how much of that work could start from a plain-language description. We first explored Joule and tested the Cloud Integration screen called <SPAN class="">Generate Integrations with assistance from AI</SPAN>. Seeing an iFlow appear from a prompt was useful, but our early tests also showed the gap we needed to solve: an incomplete prompt could lead to an assumed route, a three-iFlow request could arrive as one artifact, and a detailed <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/define-timer-start-event?locale=en-US&q=Timer" target="_self" rel="noopener noreferrer">Timer</A> result could still contain SAP Integration Suite errors and sample script code.</P><P class="">That led us to build iFlow Studio. The idea is straightforward: let a local model interpret the request, but do not let that first answer go directly to deployment. Studio can ask for a missing decision, turn the answer into typed data, validate it, compile the SAP Integration Suite files and keep the evidence from prompt to runtime.</P><P class=""> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="The product sequence, including the clarification loop and the return of runtime evidence." style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436246i022177C08C0A2F3F/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_0-1784744180699.png" alt="The product sequence, including the clarification loop and the return of runtime evidence." /><span class="lia-inline-image-caption" onclick="event.preventDefault();">The product sequence, including the clarification loop and the return of runtime evidence.</span></span></P><P class="">In the earlier three-iFlow test, SAP created one artifact containing several process areas and supplied routing that the prompt had left open SAP Integration Suite then reported a warning on the generated route.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_1-1784744259074.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436247i98CA08AB121FB861/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_1-1784744259074.png" alt="MarianVatafu_1-1784744259074.png" /></span></P><P class=""><EM>The earlier SAP AI-assisted result placed the requested roles in one artifact.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_2-1784744316860.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436248i468BBDC4C5CA2869/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_2-1784744316860.png" alt="MarianVatafu_2-1784744316860.png" /></span></P><P class=""><EM>SAP Integration Suite reported a warning on the route generated from the incomplete prompt.</EM></P><H1 id="toc-hId-1494526089">The problem in our three-iFlow pattern</H1><P class="">On our case, an interface is normally split into three iFlows. <SPAN class="">MAIN</SPAN> is the orchestrator and owns the external entry point. <SPAN class="">Publish</SPAN> reads the source message and maps it into a technology-independent canonical form. <SPAN class="">Subscribe</SPAN> maps that canonical message into the format expected by the target. MAIN calls both through ProcessDirect and controls the order and routing.</P><P class="">That separation is useful in a large integration landscape, but it makes generation harder. The SAP workflow we tested generates inside one artifact context. To build our pattern there, we would have to generate MAIN, Publish and Subscribe separately and repeatedly carry the shared <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/processdirect-adapter?locale=en-US&q=processdirect" target="_self" rel="noopener noreferrer">ProcessDirect</A> addresses, message contract, naming, headers and context from the other two flows. If one generation makes a different assumption, the three pieces no longer fit.</P><P class="">The other issue is ambiguity. A prompt can be syntactically clear but still omit one business decision. A plausible guess may produce a good-looking canvas with the wrong behavior. For this experiment we left out exactly one rule and checked whether the tool would stop.</P><H2 id="toc-hId-1427095303">The prompt</H2><P class="">A prompt is the written contract for the interface: how a message enters, what it contains, which steps and adapters are allowed, what must stay configurable, how <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/define-router?locale=en-US&q=router" target="_self" rel="noopener noreferrer">routes</A> behave and what the response should prove. Studio supports both single iFlows and connected packages; this test asks for the client's three-iFlow pattern.</P><pre class="lia-code-sample language-yaml"><code>Create exactly three SAP Cloud Integration iFlows for a synthetic order decision demo.
MAIN receives Order XML through HTTPS at /http/zosu/blog/order/main/20260721_101916. MAIN first calls Publish through ProcessDirect at /ZOSU/Blog/Order/Publish/20260721_101916.
Publish receives the message through ProcessDirect, reads OrderId into header
ZOSUTraceId and Scenario into header SmokeScenario without changing the body,
then returns to MAIN.
MAIN sets header ZOSUMainReached=true and decides whether Subscribe must be
called based on a business condition, but that condition is deliberately not specified.
Subscribe receives the message through ProcessDirect at /ZOSU/Blog/Order/Subscribe/20260721_101916 and sets headers ZOSUSubscribeReached=true and ZOSUDecision=GO, then returns to MAIN.
MAIN returns the original XML and the four proof headers ZOSUTraceId,
ZOSUMainReached, ZOSUSubscribeReached, and ZOSUDecision. Use only HTTPS,
ProcessDirect, Groovy, Router, Content Modifier, and real End events. Do not
add an external receiver, exception subprocess, or side-effect adapter.</code></pre><P class="">The missing part is the condition that decides whether MAIN calls Subscribe.</P><H2 id="toc-hId-1230581798">Studio asks instead of guessing</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_3-1784744598977.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436249i555BDA1ADB046386/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_3-1784744598977.png" alt="MarianVatafu_3-1784744598977.png" /></span></P><P class=""><EM>Planning stops because the Subscribe decision is not defined.</EM></P><P class="">We answered in Run Chat:</P><pre class="lia-code-sample language-abap"><code>When SmokeScenario=HOLD, end in MAIN after setting ZOSUDecision=HOLD and ZOSUSubscribeReached=false. For every other value, call Subscribe.</code></pre><P class="">The answer created child run 20260721T103734682cb945 below parent run 20260721T103655_a6fbde52. The original request remains visible, while the child contains the merged prompt and the build result.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_4-1784744781192.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436251i18322A2F4BB7620B/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_4-1784744781192.png" alt="MarianVatafu_4-1784744781192.png" /></span></P><P class=""><EM>The clarification starts a traceable child run; the first run is not overwritten.</EM></P><P class=""> </P><H2 id="toc-hId-1034068293">What happens after the answer</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_5-1784744844848.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436252i9EA6EC35EF50C72A/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_5-1784744844848.png" alt="MarianVatafu_5-1784744844848.png" /></span></P><P class=""><EM>Six stages take the request from text to saved SAP Integration Suite artifacts.</EM></P><P class="">1. <SPAN class="">Receive</SPAN> stores the prompt, attachments and run identity.</P><P class="">2. <SPAN class="">Plan</SPAN> checks ambiguity and produces the proposed flows.</P><P class="">3. <SPAN class="">Validate IR</SPAN> checks schema, semantics, adapters, routes and references.</P><P class="">4. <SPAN class="">Compile</SPAN> writes SAP Integration Suite BPMN XML, scripts, metadata and parameter files.</P><P class="">5. <SPAN class="">Package</SPAN> creates the three import ZIPs and runs preflight checks.</P><P class="">6. <SPAN class="">Save run</SPAN> keeps the prompt, lineage, generated bytes and reports together.</P><P class="">Existing SAP Integration Suite code was converted into typed JSON and smaller searchable package, flow, step, and dependency examples. Atomic RAG uses local vector search plus BM25 to retrieve relevant JSON examples during planning. Planning inference runs on a local LLM served through llama.cpp.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_0-1784890673621.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436905iA84681AFBF9E2060/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_0-1784890673621.png" alt="MarianVatafu_0-1784890673621.png" /></span></P><P class=""><EM>The planning trace shows the retrieval stage used for this request.</EM></P><P class=""> </P><H2 id="toc-hId-837554788">From prompt to typed IR and SAP Integration Suite files</H2><P class="">The planner does not write the final .iflw file directly. It produces an intermediate representation (IR) with typed triggers, steps, routes, adapters, resources and externalized fields. The compiler receives that validated structure.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_7-1784744956437.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436255i691D63617858BC13/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_7-1784744956437.png" alt="MarianVatafu_7-1784744956437.png" /></span></P><P class=""><EM>The compiler consumes validated fields—not the original prose—when it writes BPMN and resources.</EM></P><P class="">This shortened MAIN comes from the completed child run:</P><pre class="lia-code-sample language-abap"><code>{
"role": "MAIN",
"trigger": {
"type": "https",
"url_path": "{{TRIGGER_CONFIG_UrlPath}}"
},
"steps": [
{"id": "call_publish", "type": "process_direct_call"},
{"id": "set_main_reached", "type": "script"},
{
"id": "check_scenario",
"type": "exclusive_gateway",
"condition": "${header.SmokeScenario} = ${property.CHECK_SCENARIO_ROUTER_Branch_1_Value_1}",
"hold_target": "hold_logic",
"default_branch": "call_subscribe"
},
{"id": "call_subscribe", "type": "process_direct_call"}
]</code></pre><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_8-1784745012835.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436256i13B20D1A4B612FF6/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_8-1784745012835.png" alt="MarianVatafu_8-1784745012835.png" /></span></P><P class=""><EM>The JSON plan can be inspected without opening the generated ZIP.</EM></P><P class="">The validation stage repaired the ProcessDirect trigger/address alignment before compilation. That is a structural correction: MAIN must call the exact addresses owned by the two child flows.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_9-1784745064489.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436258iEDCAA7E2BF1626A3/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_9-1784745064489.png" alt="MarianVatafu_9-1784745064489.png" /></span></P><P class=""><EM>The validator records the ProcessDirect repair.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_10-1784745095595.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436261i8260D35C86005931/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_10-1784745095595.png" alt="MarianVatafu_10-1784745095595.png" /></span></P><P class=""><EM>A known SAP Integration Suite skeleton is patched with this flow's components.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_11-1784745125665.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436263iE018ABBD69BB6867/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_11-1784745125665.png" alt="MarianVatafu_11-1784745125665.png" /></span></P><P class=""><EM>MAIN is compiled into BPMN XML and resources.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_12-1784745190930.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436265iC32EFF588C9BF44D/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_12-1784745190930.png" alt="MarianVatafu_12-1784745190930.png" /></span></P><P class=""><EM>Packaging produces three inner ZIPs and the audit bundle.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_13-1784745234086.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436266i3DFB7712C3ECEB9A/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_13-1784745234086.png" alt="MarianVatafu_13-1784745234086.png" /></span></P><P class=""><EM>Semantic and SAP Integration Suite preflight finish without red findings.</EM></P><P class=""> </P><H2 id="toc-hId-641041283">The three generated iFlows</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_14-1784745287223.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436267i34936A132A2907CC/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_14-1784745287223.png" alt="MarianVatafu_14-1784745287223.png" /></span></P><P class=""><EM>One prompt produces three separate SAP Integration Suite import ZIPs.</EM></P><P class="">The flow responsibilities now match our pattern:</P><UL><LI><SPAN class="">MAIN</SPAN> owns <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/https-sender-adapter?locale=en-US&q=https+adapter" target="_self" rel="noopener noreferrer">HTTPS</A>, calls Publish first, sets ZOSUMainReached, routes HOLD locally and calls Subscribe for every other value.</LI><LI><SPAN class="">Publish</SPAN> has a ProcessDirect sender. It extracts OrderId and Scenario, then returns the same XML to MAIN.</LI><LI><SPAN class="">Subscribe</SPAN> has a ProcessDirect sender. It writes the GO proof headers and returns to MAIN.</LI></UL><P class="">The important ProcessDirect behavior is <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/define-request-reply?locale=en-US&q=request+reply" target="_self" rel="noopener noreferrer">request/reply</A>. Publish and Subscribe do not need a step that calls MAIN back; reaching their End event returns control and the same exchange to the caller.</P><TABLE cellspacing="0" cellpadding="0"><TBODY><TR><TD><P class=""><SPAN class="">Boundary </SPAN></P></TD><TD><P class=""><SPAN class="">Body </SPAN></P></TD><TD><P class=""><SPAN class="">Headers added</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">Caller → MAIN </SPAN></P></TD><TD><P class=""><SPAN class="">Order XML </SPAN></P></TD><TD><P class=""><SPAN class="">input HTTP headers</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">MAIN → Publish → MAIN </SPAN></P></TD><TD><P class=""><SPAN class="">unchanged Order XML </SPAN></P></TD><TD><P class=""><SPAN class="">ZOSUTraceId, SmokeScenario</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">MAIN HOLD return </SPAN></P></TD><TD><P class=""><SPAN class="">unchanged Order XML </SPAN></P></TD><TD><P class=""><SPAN class="">ZOSUMainReached=true,</SPAN></P><P class=""><SPAN class="">ZOSUDecision=HOLD,</SPAN></P><P class=""><SPAN class="">ZOSUSubscribeReached=false</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">MAIN → Subscribe → MAIN </SPAN></P></TD><TD><P class=""><SPAN class="">unchanged Order XML </SPAN></P></TD><TD><P class=""><SPAN class="">ZOSUSubscribeReached=true,</SPAN></P><P class=""><SPAN class="">ZOSUDecision=GO</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">MAIN → caller </SPAN></P></TD><TD><P class=""><SPAN class="">unchanged Order XML </SPAN></P></TD><TD><P class=""><SPAN class="">four proof headers</SPAN></P></TD></TR></TBODY></TABLE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_15-1784745427418.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436268i5309A98405BAD16B/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_15-1784745427418.png" alt="MarianVatafu_15-1784745427418.png" /></span></P><P class=""><EM>Publish is an inbound ProcessDirect child of MAIN.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_16-1784745472408.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436269i363C28EAAFD7BAFD/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_16-1784745472408.png" alt="MarianVatafu_16-1784745472408.png" /></span></P><P class=""><EM>MAIN owns HTTPS, then calls Publish before the HOLD/GO router.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_17-1784745507151.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436270iE9BBBB61A7F9BF65/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_17-1784745507151.png" alt="MarianVatafu_17-1784745507151.png" /></span></P><P class=""><EM>Subscribe sets the GO headers and returns through ProcessDirect.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_18-1784745541140.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436271i046A661B8E8DA395/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_18-1784745541140.png" alt="MarianVatafu_18-1784745541140.png" /></span></P><P class=""><EM>HOLD ends in MAIN; GO also visits Subscribe.</EM></P><P class=""> </P><H2 id="toc-hId-444527778">Configuration that remains outside the flow logic</H2><P class="">The generated package keeps deploy-time values in parameters.prop and parameters.propdef. SAP Integration Suite exposed the same defaults after upload. For MAIN these included the HTTPS path, RoleBased, <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/defining-permissions-for-senders-to-process-messages-on-runtime-node?locale=en-US&q=ESBMessaging.send" target="_self" rel="noopener noreferrer">ESBMessaging.send</A>, XSRF protection, body-size limit, both ProcessDirect addresses, XML character handling and the HOLD literal. Publish and Subscribe exposed their own ProcessDirect addresses.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_19-1784745590308.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436272i7F91C83BB9F154A9/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_19-1784745590308.png" alt="MarianVatafu_19-1784745590308.png" /></span></P><P> </P><P class=""><EM>SAP Integration Suite shows the defaults used by the compiled MAIN artifact.</EM></P><P class="">Business behavior still belongs in the IR and generated resources: header extraction, the router shape, the HOLD script and the GO header writes. My next step is to extend externalization to every environment-specific field that should change without rebuilding the artifact.</P><H1 id="toc-hId-118931554">Upload and SAP Integration Suite design-time proof</H1><P class="">The guarded upload used the three ZIPs from child run 20260721T103734_682cb945 and added the common stamp 20260721101916. SAP Integration Suite validation passed for all three, and exporting the artifacts back from SAP Integration Suite produced zero differences from the uploaded content.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_20-1784745690939.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436273i21C207985412BA8E/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_20-1784745690939.png" alt="MarianVatafu_20-1784745690939.png" /></span></P><P> </P><P class=""><EM>The package contains MAIN, Publish and Subscribe from the same run.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_21-1784745715980.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436274i01AC9078B996130A/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_21-1784745715980.png" alt="MarianVatafu_21-1784745715980.png" /></span></P><P> </P><P class=""><EM>SAP Integration Suite renders the same MAIN sequence seen in Studio.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_22-1784745742171.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436275i3536C81EAF518586/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_22-1784745742171.png" alt="MarianVatafu_22-1784745742171.png" /></span></P><P class=""><EM>Publish has one inbound ProcessDirect participant</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_23-1784745774100.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436276i6849B60AF6374BA3/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_23-1784745774100.png" alt="MarianVatafu_23-1784745774100.png" /></span></P><P> </P><P class=""><EM>Subscribe has one inbound ProcessDirect participant.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_24-1784745808232.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436277iEB736F433BCFC7A0/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_24-1784745808232.png" alt="MarianVatafu_24-1784745808232.png" /></span></P><P> </P><P class=""><EM>Problems shows no data; Publish and Subscribe were checked the same way.</EM></P><H1 id="toc-hId--77581951">Deployment and runtime proof</H1><P class="">We deployed the dependencies in this order: Subscribe, Publish, MAIN. All three reached STARTED.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_25-1784745848976.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436278iA3CDDCC3EBBCCD41/image-size/medium?v=v2&px=400" role="button" title="MarianVatafu_25-1784745848976.png" alt="MarianVatafu_25-1784745848976.png" /></span></P><P class=""><EM>Manage Integration Content after deployment.</EM></P><P class="">We then called the single MAIN HTTPS endpoint with two XML messages. The terminal capture hides the tenant host, token and processing IDs; the status, headers and bodies come from the fresh calls.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_26-1784745911757.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436279i78585D929FF6B912/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_26-1784745911757.png" alt="MarianVatafu_26-1784745911757.png" /></span></P><P class=""><EM>Both curl calls returned HTTP 200 and the original XML.</EM></P><P class="">For GO, SAP Integration Suite executed MAIN, Publish and Subscribe. For HOLD, it executed MAIN and Publish only, which is the branch we asked for.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarianVatafu_27-1784745943914.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436280iE79F2079BB055EC5/image-size/large?v=v2&px=999" role="button" title="MarianVatafu_27-1784745943914.png" alt="MarianVatafu_27-1784745943914.png" /></span></P><P class=""><EM>SAP Integration Suite Monitor groups three completed executions for GO and two for HOLD.</EM></P><H1 id="toc-hId-495644627">What the run proved</H1><TABLE cellspacing="0" cellpadding="0"><TBODY><TR><TD><P class=""><SPAN class="">Check </SPAN></P></TD><TD><P class=""><SPAN class="">Result</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">Ambiguous business rule </SPAN></P></TD><TD><P class=""><SPAN class="">Studio stopped and asked</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">Parent/child history </SPAN></P></TD><TD><P class=""><SPAN class="">linked and visible</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">Prompt, IR and generated topology </SPAN></P></TD><TD><P class=""><SPAN class="">matched</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">Generated artifacts </SPAN></P></TD><TD><P class=""><SPAN class="">three separate ZIPs</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">Problems </SPAN></P></TD><TD><P class=""><SPAN class="">zero red, zero yellow</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">Export comparison </SPAN></P></TD><TD><P class=""><SPAN class="">zero differences</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">Deployment </SPAN></P></TD><TD><P class=""><SPAN class="">all three STARTED</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">GO </SPAN></P></TD><TD><P class=""><SPAN class="">HTTP 200, unchanged body, exact GO headers, three completed executions</SPAN></P></TD></TR><TR><TD><P class=""><SPAN class="">HOLD </SPAN></P></TD><TD><P class=""><SPAN class="">HTTP 200, unchanged body, exact HOLD headers, two completed </SPAN><SPAN class="">executions</SPAN></P></TD></TR></TBODY></TABLE><P class="">This is still a synthetic acceptance case, not a production interface. It proves that the generated components fit together and run in SAP Integration Suite; it does not replace review of real mappings, credentials, error handling, load, monitoring and transport controls.</P><H1 id="toc-hId-299131122">Conclusion</H1><P class="">The useful part of this experiment was not that a model could draw an iFlow. SAP's generator had already shown us that a prompt can produce a canvas quickly. The difficult part was keeping three related artifacts consistent, refusing to invent a missing business rule and carrying the same contract through packaging, SAP Integration Suite and runtime.</P><P class="">In this run, Studio asked one question, generated the three roles in the correct arrangement and produced files that SAP Integration Suite accepted without Problems. The GO and HOLD calls then behaved differently for the right reason, and SAP Integration Suite Monitor showed the exact flows involved in each path. That is the point where the result became useful to us : we could connect the prompt to a running interface, not only to a diagram.</P><H1 id="toc-hId-102617617">Next steps</H1><UL><LI><SPAN class="">Improve the automatic layout.</SPAN> The generated iFlows work, but spacing, alignment and connector routing should be cleaner when the artifact first opens in SAP Integration Suite Designer.</LI><LI><SPAN class="">Externalize every environment-specific value.</SPAN> Hosts, paths, credential aliases, schedules, queue names, timeouts and other deployment settings should move between environments without editing BPMN or scripts.</LI><LI><SPAN class="">Help users describe the integration problem.</SPAN> Studio should make triggers, message contracts, routing rules, adapters, error behavior and expected results easier to specify, and ask again when an omitted answer changes the flow.</LI></UL><P>If you have any questions, feel free to reply here, or even go to the dedicated<SPAN> </SPAN><A href="https://community.sap.com/t5/forums/searchpage/tab/message?filter=includeQandA&q=SAP%20Integration%20Suite&include_qanda=true&collapse_discussion=true" target="_blank">Q&A Section</A><SPAN> </SPAN>for SAP Integration Suite.</P><P>Thank you for your time !</P>2026-07-22T21:01:06.037000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/integrating-amazon-fba-with-sap-s4-hana-part-3/ba-p/14227294Integrating Amazon FBA with SAP S4 HANA - Part 32026-07-23T01:30:00.973000+02:00Shailenduhttps://community.sap.com/t5/user/viewprofilepage/user-id/225524<P>Just in case you landed here directly, this is the third chapter in this series about integrating SAP S/4HANA with Amazon Seller Central. This article focuses on <STRONG>Amazon FBA SAP S4 HANA integration</STRONG>.</P><P>Unlike FBM, Amazon FBA is best modelled as a consignment process because Amazon physically holds and ships the inventory while the merchant continues to own it until the product is sold.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Amazon FBA SAP S4 HANA integration and consignment process" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436313i8C1EAB03BCEE5B7F/image-size/large?v=v2&px=999" role="button" title="How to Integrate Amazon FBA and SAP S4 HANA.png" alt="How to Integrate Amazon FBA and SAP S4 HANA.png" /></span></P><UL><LI>In the first part I covered Amazon merchant models, the Selling Partner API, master data setup, and the process of obtaining an Amazon Developer ID. Here is the link to the article <A href="https://community.sap.com/t5/technology-blog-posts-by-members/how-to-get-started-with-sap-s-4hana-and-amazon-seller-central-integration/ba-p/14151024" target="_blank">How to Get Started with SAP S/4HANA and Amazon Seller Central Integration</A> </LI><LI>In the <A href="https://community.sap.com/t5/technology-blog-posts-by-members/amazon-seller-central-sap-s4-hana-integration-part-2-fulfilled-by-merchant/ba-p/14157584" target="_blank">second part on Fulfilled by Merchant</A><SPAN>, I explained how Amazon FBM maps to the standard SAP Sales and Distribution order-to-cash cycle.</SPAN></LI></UL><P>That distinction changes how inventory, revenue, receivables, tax, returns, reimbursements, and Amazon settlements should be recorded in SAP S/4HANA.</P><P> </P><P><EM>US division of a European Food Processing Company closed down their Amazon marketplace simply because they weren't able to manage the processes and reconcile their financials. </EM> <BR /><EM>A nutrition supplement company outsources their complete Amazon operations for a significant fees to a third party provider.</EM></P><P>If you Amazon FBA is the model you are exploring for your business, this tutorial will help simplify the entire concept and give you some confidence <span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span> of mapping the process in the SAP terminologies. </P><HR /><H2 id="toc-hId-1761042233">Amazon FBA SAP S4 HANA Integration: Complete Consignment Process</H2><P>Amazon Fulfilled by Amazon, commonly called FBA, allows merchants to send inventory in bulk to Amazon fulfillment centers. Amazon then stores the inventory and manages order picking, packing, customer delivery, customer service, and returns.</P><P>In SAP S/4HANA, this model closely matches the customer consignment process. The goods remain the merchant’s property while they are stored at Amazon. Revenue is recognized only when a customer purchases the product and Amazon fulfills the order.</P><HR /><H3 id="toc-hId-1693611447">Amazon FBA and SAP S/4HANA: Key Takeaways</H3><P>Here are the key takeaways from mapping Amazon FBA with Consignment Process within SAP. </P><UL><LI>Stock sent to Amazon is recorded as customer consignment stock.</LI><LI>Inventory remains owned by the merchant until the customer sale.</LI><LI>No revenue is recognized when goods are initially sent to Amazon.</LI><LI>A customer purchase creates a consignment issue in SAP.</LI><LI>Customer returns create consignment returns and credit adjustments.</LI><LI>Unsold stock returned by Amazon creates a consignment pick-up.</LI><LI>Amazon settlements must be matched against sales, fees, returns, reserves, and reimbursements.</LI><LI>Special stock indicator W keeps Amazon-held inventory separate and visible.</LI></UL><HR /><H3 id="toc-hId-1497097942">What Is Amazon FBA? What are the steps involved business process wise</H3><P>Business process wise Amazon FBA cycle starts with the following steps.</P><UL><LI><STRONG>Identifying merchandize you will be selling</STRONG> - A big decision is which of your products you would want to launch on Amazon FBA store. Of course these are subsets of products that have a B2C demand and some market research to back it up. </LI><LI><STRONG>Sending a bulk shipment to Amazon Warehouse / Distribution Center</STRONG> - The first shipment that you sent to Amazon Warehouse, it often a butterfly in the stomach instance. You need to create a shipment prior to this with all the items that you intend to send to Amazon. You may also do some carrier shopping. In many cases I have seen Amazon's own carrier being the most cost effective.</LI></UL><P> <span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shailendu_1-1784761035345.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436325i54DE157F477BFB29/image-size/large?v=v2&px=999" role="button" title="Shailendu_1-1784761035345.png" alt="Shailendu_1-1784761035345.png" /></span></P><UL><LI><STRONG>When Amazon order comes through - </STRONG>As customers place orders, Amazon fulfills them and sends the information back to SAP. Each order is recorded as a consignment issue. In SAP, Amazon remains both the sold-to party and the payer, while the ship-to address is the end customer. Having the correct ship-to address is critical because it determines the tax calculation. The tax shown in SAP should match what Amazon collects and pays on behalf of the seller. Since pricing is driven by Amazon, you will need manual conditions within SAP to sync the pricing components to match Amazon will pay you at the period end. </LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shailendu_0-1784761862291.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436326i62CF2F6EFED1E806/image-size/large?v=v2&px=999" role="button" title="Shailendu_0-1784761862291.png" alt="Shailendu_0-1784761862291.png" /></span></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">When Amazon Order comes to SAP, you need to ensure that you map correct ASIN number into customer material Number and the Net Line item and Order amount should match what Amazon will pay you in their settlement cycle for this order. </P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shailendu_1-1784761941220.png" style="width: 771px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436327i2BC5ED60751386B6/image-dimensions/771x308?v=v2" width="771" height="308" role="button" title="Shailendu_1-1784761941220.png" alt="Shailendu_1-1784761941220.png" /></span></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Having synchronization at periodic intervals, keeps your A/R accurate. </P><UL><LI><STRONG>Returns</STRONG> are also tracked. When Amazon processes a return, SAP creates a consignment return, followed by a return delivery and credit memo. This keeps your accounts receivable aligned with Amazon’s adjustments.</LI><LI>Finally, <STRONG>Payment reconciliation</STRONG> takes place. Every two weeks, Amazon sends a bulk payment that covers all orders, less fees, reserves, or special charges. With proper integration, the invoices in SAP match Amazon’s payouts, reducing manual work. Although there may still be small adjustments for account-level charges, most of the process runs automatically, saving time and effort for the finance team.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shailendu_3-1784762347833.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436329i345AFEB102B97CD3/image-size/large?v=v2&px=999" role="button" title="Shailendu_3-1784762347833.png" alt="Shailendu_3-1784762347833.png" /></span></P><P>Under Amazon FBA, merchants do not ship each customer order themselves. Instead, they create an inbound shipment and send inventory in bulk to Amazon’s fulfillment network.</P><P>Amazon then handles inventory storage, order picking, packaging, delivery to the customer, customer service, customer returns, as well as selected inventory adjustments and reimbursements. This allows sellers to outsource most fulfillment operations while Amazon manages the end-to-end logistics and post-purchase experience.</P><P>The merchant continues to manage product listings, pricing, procurement, accounting, and inventory ownership.</P><H3 id="toc-hId-1300584437">Why Merchants Choose Amazon FBA</H3><P><A title="Amazon FBA advantages" href="https://sell.amazon.com/fulfillment-by-amazon" target="_blank" rel="noopener nofollow noreferrer">Merchants choose Amazon FBA</A> because it reduces logistics work and gives customers access to Amazon’s fulfillment network.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Business benefits of Amazon FBA fulfillment" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436314i068FA497E69B4BEF/image-size/large?v=v2&px=999" role="button" title="Reasons why merchant prefer FBA model.png" alt="Reasons why merchant prefer FBA model.png" /></span></P><H4 id="toc-hId-1233153651">1. Lower Logistics Overhead</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Merchants no longer need to operate their own pick-pack-ship process for FBA products. This can reduce warehouse workload, packaging effort, and carrier management.</P><H4 id="toc-hId-1036640146">2. Faster Customer Delivery</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Amazon distributes inventory across its fulfillment network and places products closer to buyers. This can shorten delivery estimates and improve the customer experience.</P><H4 id="toc-hId-840126641">3. Prime Eligibility and Buyer Trust</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">FBA products may qualify for Prime delivery. Customers also receive Amazon-managed tracking, support, and returns, which can increase confidence in the purchase.</P><H4 id="toc-hId-643613136">4. Lower Exposure to Carrier Delays</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">In an FBM model, the merchant is responsible for carrier selection and delivery performance. Late deliveries can affect the merchant’s Amazon performance metrics.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Under FBA, Amazon assumes much of this fulfillment responsibility.</P><H4 id="toc-hId-447099631">5. Greater Sales Potential</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Fast delivery, Prime eligibility, and Amazon-backed customer service can make an FBA listing more attractive than a comparable merchant-fulfilled listing.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">The trade-off is that Amazon gains physical control of the inventory while the merchant continues to own it. This is the main reason FBA should be treated as a consignment process in SAP.</P><HR /><H3 id="toc-hId-121503407">Why Amazon FBA Is a Consignment Process in SAP</H3><P>When products are stored inside an Amazon fulfillment center, they remain the merchant’s inventory.</P><P>Amazon has physical custody of the goods, but ownership has not transferred. No customer sale has occurred, and revenue should not be recognised.</P><P>This is the standard definition of consignment stock: goods stored at a customer or partner location that remain the seller’s property until they are consumed or sold.</P><P>SAP S/4HANA provides a four-step consignment cycle that maps closely to Amazon FBA.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Amazon FBA events mapped to SAP consignment steps" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436316iC4E292B57AF9EBFC/image-size/large?v=v2&px=999" role="button" title="FBA Events versus SAP Consignment Flow.png" alt="FBA Events versus SAP Consignment Flow.png" /></span></P><P><SPAN>What Is Special Stock Indicator W?</SPAN></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Special stock indicator <STRONG>W</STRONG> identifies customer consignment stock in SAP.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">It allows Amazon-held inventory to remain visible and valued as an asset while keeping it separate from normal unrestricted stock in the merchant’s warehouse.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">This distinction is important for inventory reporting, balance-sheet accuracy, available-to-promise calculations, and reconciliation with Amazon’s inventory reports.</P><H3 id="toc-hId--150241467">Amazon FBA Integration Architecture</H3><P>A complete Amazon FBA SAP S4 HANA integration normally connects Amazon Seller Central, Amazon Selling Partner API, SAP Sales and Distribution, Materials Management, Finance, and an integration platform or middleware layer.</P><P>The integration must support bidirectional data movement.</P><H4 id="toc-hId--640157979">Data Moving from SAP to Amazon</H4><UL><LI>Product and SKU data</LI><LI>Inventory planned for inbound shipments</LI><LI>Shipment and carton details</LI><LI>Product identifiers and mappings</LI><LI>Selected pricing or availability information</LI></UL><H4 id="toc-hId--836671484">Data Moving from Amazon to SAP</H4><UL><LI>FBA customer orders</LI><LI>Shipment and fulfillment data</LI><LI>Customer delivery addresses</LI><LI>Returns and refunds</LI><LI>FBA inventory balances</LI><LI>Lost and damaged inventory adjustments</LI><LI>Amazon fees and commissions</LI><LI>Reimbursements</LI><LI>Settlement and payout reports</LI></UL><H3 id="toc-hId--739781982">Master Data Required for Amazon FBA SAP S4 HANA Integration</H3><P>Reliable master data is the foundation of the integration. Incorrect mappings will eventually create inventory differences, tax errors, unmatched settlements, and incorrect receivables.</P><H4 id="toc-hId--1229698494">Amazon as Customer or Business Partner</H4><P>Amazon must be created as a customer or business partner because the SAP consignment cycle is executed against a customer account.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shailendu_5-1784762801176.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436331i046893F14A7E4928/image-size/large?v=v2&px=999" role="button" title="Shailendu_5-1784762801176.png" alt="Shailendu_5-1784762801176.png" /></span></P><P class="lia-align-center" style="text-align: center;"><FONT size="2">Figure - Create Amazon as a business partner against which the consignment cycle will execute. </FONT></P><P>In a common FBA design:</P><UL><LI><STRONG>Sold-To Party:</STRONG> Amazon</LI><LI><STRONG>Payer:</STRONG> Amazon</LI><LI><STRONG>Ship-To:</STRONG> The end customer’s delivery address</LI></UL><P>Amazon is responsible for settling the merchant’s proceeds, but the end customer’s address is required for tax calculation and transaction reporting.</P><H4 id="toc-hId--1426211999">Amazon Consignment Inventory Structure</H4><P>The merchant must decide how Amazon-held inventory will be represented in SAP.</P><P>Depending on the implementation, FBA stock may be organised through a dedicated plant, storage location, customer consignment structure, or reporting dimension.</P><P>Many businesses maintain a dedicated storage location or reporting structure so Amazon inventory is never confused with stock physically available in their own warehouse.</P><H4 id="toc-hId--1622725504">ASIN, Seller SKU, and SAP Material Mapping</H4><P>Every Amazon ASIN or Seller SKU must map to the correct SAP material number.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shailendu_6-1784762922761.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436332iE92DC6AE6B87B155/image-size/large?v=v2&px=999" role="button" title="Shailendu_6-1784762922761.png" alt="Shailendu_6-1784762922761.png" /></span></P><P>This mapping may be maintained through Customer Material Information Records or an integration-layer mapping table.</P><P>The mapping should work in both directions:</P><UL><LI>Amazon ASIN or Seller SKU to SAP material number</LI><LI>SAP material number to Amazon ASIN or Seller SKU</LI></UL><P>This mapping is required for fill-ups, customer sales, returns, inventory adjustments, reimbursements, and settlement reconciliation.</P><H4 id="toc-hId--1819239009">Amazon Fee and SAP Condition-Type Mapping</H4><P>Amazon commissions, FBA fulfillment fees, discounts, promotions, and other order-level charges should be mapped to appropriate SAP pricing condition types.</P><P>This allows the SAP net receivable to align with the order-level amount Amazon reports as payable.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Shailendu_7-1784762967706.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436333i11D5C654E6DFE133/image-size/large?v=v2&px=999" role="button" title="Shailendu_7-1784762967706.png" alt="Shailendu_7-1784762967706.png" /></span></P><P> </P><H3 id="toc-hId--1722349507">Consignment Fill-Up: Sending Inventory to Amazon</H3><P>The FBA process begins when the merchant sends inventory to Amazon.</P><P>This step involves coordinated activity in Amazon Seller Central and SAP S/4HANA.</P><H4 id="toc-hId-2082701277">Amazon-Side Inbound Shipment Process</H4><P>In Seller Central, the merchant creates an inbound shipment or FBA shipment plan.</P><P>The merchant provides:</P><UL><LI>Products being sent</LI><LI>Quantity of each product</LI><LI>Source warehouse</LI><LI>Carton configuration</LI><LI>Preparation details</LI><LI>Shipping method</LI></UL><P>Amazon provides item labels, carton labels, preparation instructions, and fulfillment-center destinations.</P><P>Amazon may divide one inbound shipment across several fulfillment centers based on its inventory-placement requirements.</P><H4 id="toc-hId-2054371463">SAP Consignment Fill-Up Process</H4><P>In SAP S/4HANA, the corresponding process normally includes:</P><OL><LI>Creation of a consignment fill-up sales order</LI><LI>Creation of an outbound delivery</LI><LI>Picking and packing</LI><LI>Post Goods Issue</LI></OL><P>The goods issue moves stock from the merchant’s warehouse into Amazon customer consignment stock under special stock indicator W.</P><H4 id="toc-hId-1857857958">No Revenue at Consignment Fill-Up</H4><P><STRONG>No revenue or customer receivable should be posted when inventory is sent to Amazon.</STRONG></P><P>The merchant has moved inventory to another physical location, but the inventory has not yet been sold.</P><P>Recognising revenue during the fill-up would overstate sales, receivables, profit, and potentially tax.</P><H4 id="toc-hId-1661344453">Tracking Multiple Amazon Fulfillment Centers</H4><P>Amazon may send an inbound shipment to several fulfillment centers and later redistribute units within its network.</P><P>SAP does not always need to represent every fulfillment center as a separate accounting location. Many merchants track the aggregate consignment quantity held by Amazon while allowing Amazon to manage fulfillment-center-level placement.</P><P>Businesses requiring detailed operational reporting can maintain additional fulfillment-center visibility in the integration layer.</P><HR /><H3 id="toc-hId-1758233955">Consignment Issue: Processing Amazon FBA Customer Orders</H3><P>When a customer buys a product, Amazon picks, packs, and ships it from an FBA fulfillment center.</P><P>Amazon then makes the order and fulfillment information available through SP-API endpoints and reports.</P><P>In SAP, the completed customer sale is recorded as a <STRONG>consignment issue</STRONG>.</P><P>This is the moment when:</P><UL><LI>The product leaves special stock W.</LI><LI>Ownership transfers to the buyer.</LI><LI>Revenue is recognised.</LI><LI>The Amazon receivable is posted.</LI><LI>Relevant fees and taxes are recorded.</LI></UL><H4 id="toc-hId-1268317443">Amazon Order Number</H4><P>The Amazon order number should be stored in a searchable SAP reference field. Many implementations map it to the customer purchase-order field.</P><P>This reference is required for customer service, returns, settlement matching, and audit trails.</P><H4 id="toc-hId-1071803938">Sold-To, Payer, and Ship-To Determination</H4><P>Amazon normally remains the Sold-To Party and Payer because Amazon settles the merchant’s proceeds.</P><P>The end customer’s address is used as the Ship-To information. This address is especially important for tax determination.</P><H4 id="toc-hId-875290433">Product and Quantity Mapping</H4><P>Each Amazon SKU or ASIN must resolve to the correct SAP material. The consignment issue must consume the correct quantity from Amazon consignment stock.</P><H4 id="toc-hId-678776928">Amazon Fees and Net Receivables</H4><P>Amazon commissions, FBA fulfillment fees, discounts, and other order-level charges should be represented through SAP pricing condition types or related financial postings.</P><P>A useful validation rule is:</P><P><STRONG>If the SAP net receivable does not match Amazon’s order-level payable amount, the fee or pricing mapping is incomplete.</STRONG></P><H3 id="toc-hId-775666430">Amazon Marketplace Facilitator Tax in SAP</H3><P>Tax requires special attention in an Amazon FBA integration.</P><P>Under Marketplace Facilitator laws in the United States and similar rules in other regions, Amazon may calculate, collect, and remit sales tax on behalf of the merchant.</P><H4 id="toc-hId-285749918">Why the Ship-To Address Matters</H4><P>Tax generally follows the customer’s delivery destination. The end customer’s address must therefore be available in SAP even when Amazon is the Sold-To Party and Payer.</P><P>The ship-to address allows SAP to determine the correct tax jurisdiction and compare the result with Amazon’s tax reporting.</P><H4 id="toc-hId-257420104">Statistical Tax Condition</H4><P>Amazon-collected tax is often represented as a statistical condition in SAP.</P><P>This keeps the amount visible and reconcilable without incorrectly treating it as tax the merchant must remit where Amazon is responsible for remittance.</P><P>The SAP tax amount should align with Amazon’s Marketplace Facilitator reporting. A close match indicates that the ship-to and tax determination logic is working correctly.</P><H3 id="toc-hId-354309606">Consignment Return: Processing Amazon Customer Returns</H3><P>When Amazon accepts a customer return and places the product back into sellable FBA inventory, the transaction should create a consignment return in SAP.</P><P>The SAP process normally includes:</P><OL><LI>Consignment return order</LI><LI>Return delivery</LI><LI>Inventory movement back into special stock W</LI><LI>Credit memo linked to the original transaction</LI></OL><P>The return should reference the original Amazon order and the original SAP consignment issue whenever possible.</P><P>This ensures that SAP:</P><UL><LI>Reduces or reverses the original receivable</LI><LI>Restores eligible inventory to Amazon consignment stock</LI><LI>Records the credit memo correctly</LI><LI>Matches Amazon’s customer refund</LI></UL><H4 id="toc-hId--135606906">Sellable and Unsellable FBA Returns</H4><P>Not every customer return is placed back into sellable inventory.</P><P>Amazon may classify returned inventory as:</P><UL><LI>Sellable</LI><LI>Customer damaged</LI><LI>Carrier damaged</LI><LI>Warehouse damaged</LI><LI>Defective</LI><LI>Unsellable</LI></UL><P>The integration should use this disposition to determine whether the unit returns to sellable consignment stock or requires an adjustment, reimbursement claim, disposal, or removal order.</P><H3 id="toc-hId--38717404">Consignment Pick-Up: Returning Unsold Inventory</H3><P>Slow-moving FBA inventory can generate storage and aged-inventory charges. Merchants may also want to discontinue a product, change packaging, or move stock to another sales channel.</P><P>In these situations, the merchant creates a removal order in Seller Central.</P><P>When Amazon returns the inventory, SAP processes a <STRONG>consignment pick-up</STRONG>.</P><P>The inventory movement is:</P><P><STRONG>Amazon consignment stock under special stock W → merchant-owned warehouse inventory.</STRONG></P><P>This closes the inventory loop for goods sent to Amazon but never sold.</P><H3 id="toc-hId--235230909">Amazon FBA Inventory Reconciliation in SAP</H3><P>Inventory reconciliation is one of the most important differences between Amazon FBA and FBM.</P><P>Under FBM, the merchant physically controls the inventory. Under FBA, Amazon stores, transfers, fulfills, and adjusts the inventory across its network.</P><P>FBA units can become:</P><UL><LI>Lost inside the fulfillment network</LI><LI>Damaged by Amazon</LI><LI>Damaged by a carrier</LI><LI>Disposed of</LI><LI>Transferred between fulfillment centers</LI><LI>Reserved for customer orders</LI><LI>Classified as unsellable</LI><LI>Reimbursed by Amazon</LI></UL><P>SAP consignment stock should be reconciled periodically against Amazon’s FBA inventory ledger and adjustment reports.</P><H4 id="toc-hId--725147421">Inventory Reconciliation Data</H4><P>The reconciliation should compare:</P><UL><LI>Opening FBA inventory</LI><LI>Inbound shipment receipts</LI><LI>Customer shipments</LI><LI>Customer returns</LI><LI>Fulfillment-center transfers</LI><LI>Lost or damaged units</LI><LI>Disposals</LI><LI>Removal orders</LI><LI>Amazon reimbursements</LI><LI>Closing FBA inventory</LI></UL><P>Confirmed differences should create the appropriate SAP inventory or financial adjustment.</P><P>Without regular reconciliation, the quantity recorded as Amazon consignment stock in SAP will gradually differ from the quantity Amazon is actually holding.</P><H3 id="toc-hId--628257919">Amazon Settlement and Payment Reconciliation</H3><P>Amazon commonly settles merchant proceeds on an approximately 14-day cycle, although timing can vary by marketplace, account status, reserves, and transaction type.</P><P>A settlement can include:</P><UL><LI>Product sales</LI><LI>Customer refunds</LI><LI>Amazon commissions</LI><LI>FBA fulfillment fees</LI><LI>Storage charges</LI><LI>Removal and disposal fees</LI><LI>Advertising charges</LI><LI>Promotional costs</LI><LI>Inventory reimbursements</LI><LI>Account reserves</LI><LI>Other adjustments</LI></UL><P>The amount deposited into the bank is therefore not a simple total of customer invoices. It is a net settlement containing several transaction types.</P><H4 id="toc-hId--1118174431">Automated Amazon Settlement Reconciliation</H4><P>A scalable Amazon FBA SAP S4 HANA integration should:</P><OL><LI>Import Amazon settlement data.</LI><LI>Match sales against SAP consignment issues and invoices.</LI><LI>Match returns against credit memos.</LI><LI>Post fees to the correct general-ledger accounts.</LI><LI>Identify reimbursements and inventory adjustments.</LI><LI>Clear the Amazon customer account.</LI><LI>Highlight unmatched differences for review.</LI></OL><P>If order-level fees are mapped correctly, most transaction-level amounts can reconcile automatically.</P><H4 id="toc-hId--1314687936">Charges That May Require Separate Postings</H4><P>Some account-level charges may not be directly linked to individual customer orders:</P><UL><LI>Monthly FBA storage fees</LI><LI>Aged-inventory surcharges</LI><LI>Advertising expenses</LI><LI>Removal and disposal fees</LI><LI>Reserve adjustments</LI><LI>Other account-level deductions</LI></UL><P>These exceptions remain manageable when the main sales, return, fee, reimbursement, and settlement flows are automated.</P><H3 id="toc-hId--1217798434">Benefits of Amazon FBA SAP S4 HANA Integration</H3><H4 id="toc-hId--1539531255">True FBA Inventory Visibility</H4><P>The business always knows how much inventory is sitting at Amazon. Special stock indicator W keeps this inventory visible, correctly classified, and valued on the balance sheet.</P><H4 id="toc-hId--1736044760">Accurate Revenue Recognition</H4><P>Revenue is recognised when the customer purchase creates a consignment issue, not when inventory is sent to Amazon in bulk.</P><H4 id="toc-hId--1932558265">Automated Accounts Receivable</H4><P>Sales, returns, credit memos, fees, and reimbursements can flow into SAP without large volumes of manual journal entries.</P><H4 id="toc-hId--2129071770">Reconcilable Marketplace Tax</H4><P>Ship-to-driven statistical tax can be compared with Amazon’s Marketplace Facilitator reporting.</P><H4 id="toc-hId-1969382021">Reliable Inventory Accounting</H4><P>Amazon-held inventory remains visible as a merchant-owned asset without being confused with stock physically available in the merchant’s warehouse.</P><H4 id="toc-hId-1772868516">Faster Financial Close</H4><P>Automated settlement matching reduces the time finance teams spend investigating payouts, fees, refunds, and unexplained differences.</P><H4 id="toc-hId-1576355011">Exception-Based Operations</H4><P>Finance and operations teams can focus on genuine exceptions instead of manually processing every Amazon transaction.</P><H4 id="toc-hId-1379841506">Scalability</H4><P>The same closed-loop integration can support 100 orders per day or 10,000 orders per day without requiring a proportional increase in finance and operations headcount.</P><H3 id="toc-hId-1476731008">Amazon FBA SAP S4 HANA Integration Process Summary</H3><P>The complete process works as a closed loop:</P><OL><LI><STRONG>Consignment fill-up:</STRONG> Inventory moves to Amazon without revenue recognition.</LI><LI><STRONG>Consignment issue:</STRONG> A customer sale consumes FBA inventory and creates revenue and receivables.</LI><LI><STRONG>Consignment return:</STRONG> Eligible customer returns restore Amazon consignment stock and create credit adjustments.</LI><LI><STRONG>Consignment pick-up:</STRONG> Unsold inventory returns to the merchant’s warehouse.</LI><LI><STRONG>Inventory reconciliation:</STRONG> Lost, damaged, disposed, transferred, and reimbursed units are recorded.</LI><LI><STRONG>Settlement reconciliation:</STRONG> Sales, fees, returns, reimbursements, and reserves are matched to Amazon payouts.</LI></OL><H3 id="toc-hId-1280217503">Conclusion</H3><P><STRONG>Amazon FBA SAP S4 HANA integration</STRONG> is best designed around SAP’s customer consignment cycle.</P><P>The consignment fill-up moves stock to Amazon without recognising revenue. The consignment issue records the customer sale. Consignment returns and pick-ups keep inventory and receivables aligned. Inventory and settlement reconciliation connect SAP records with what Amazon is physically holding and financially paying.</P><P>Getting the customer master, consignment order types, ASIN mappings, ship-to information, fee conditions, tax logic, and reconciliation rules right creates a scalable foundation for Amazon growth.</P><P>The result combines Amazon’s fulfillment network with SAP S/4HANA’s inventory control and financial discipline—without losing visibility over inventory the merchant still owns.</P><P>In the next part of this series, we will cover implementation best practices and the most common mistakes businesses make when integrating Amazon FBM and FBA with SAP S/4HANA.</P><H3 id="toc-hId-1251887689">Frequently Asked Questions About Amazon FBA SAP S4 HANA Integration</H3><P>Here are some questions that are usually asked. </P><H4 id="toc-hId-761971177">What is the difference between Amazon FBA and FBM in SAP?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">With FBA, inventory is sent to Amazon in bulk and Amazon fulfills customer orders. It is best modelled as a consignment process.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">With FBM, the merchant stores and ships each order. It normally follows the standard SAP order-to-cash process.</P><H4 id="toc-hId-565457672">Why is Amazon FBA treated as consignment in SAP?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Inventory stored at Amazon remains the merchant’s property until a customer buys it. Amazon has physical custody, but ownership has not transferred.</P><H4 id="toc-hId-368944167">What are the main SAP consignment steps for Amazon FBA?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">The four main steps are consignment fill-up, consignment issue, consignment return, and consignment pick-up. Not all of them will be applicable. </P><H4 id="toc-hId-172430662">When is revenue recognised for an Amazon FBA sale?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Revenue is recognised when the customer purchases the product and SAP creates the consignment issue. Revenue is not recognised when inventory is initially sent to Amazon.</P><H4 id="toc-hId--24082843">What is special stock indicator W in SAP?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Special stock indicator W identifies customer consignment stock. It keeps Amazon-held inventory visible as merchant-owned inventory while separating it from normal unrestricted stock.</P><H4 id="toc-hId--220596348">Does sending inventory to Amazon create an invoice?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">No. A consignment fill-up represents an inventory movement, not a customer sale. It should not create revenue or a standard customer invoice.</P><H4 id="toc-hId--417109853">Who should be the Sold-To Party and Payer?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Amazon typically remains the Sold-To Party and Payer because Amazon settles the merchant’s proceeds. The end customer’s address is used as the Ship-To information.</P><H4 id="toc-hId--613623358">Why is the customer ship-to address required?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">The customer’s delivery address determines the tax jurisdiction. SAP needs this information to calculate and reconcile tax with Amazon’s Marketplace Facilitator reporting.</P><H4 id="toc-hId--810136863">How should Amazon-collected sales tax be recorded?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">It is often recorded as a statistical condition. This keeps the tax visible for reconciliation without treating it as tax the merchant must remit where Amazon is responsible.</P><H4 id="toc-hId--838466677">How are Amazon FBA customer returns handled in SAP?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">A sellable customer return creates a consignment return, return delivery, inventory movement back into special stock W, and a credit memo linked to the original transaction.</P><H4 id="toc-hId--1034980182">What happens when a returned product is unsellable?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">The Amazon disposition should determine whether the unit requires an inventory adjustment, reimbursement, disposal, or removal order instead of returning to sellable consignment stock.</P><H4 id="toc-hId--1231493687">What happens to unsold Amazon FBA inventory?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">The merchant can create a removal order in Seller Central. SAP then processes a consignment pick-up when Amazon returns the units.</P><H4 id="toc-hId--1428007192">How should lost or damaged FBA inventory be handled?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">SAP consignment inventory should be reconciled with Amazon’s FBA inventory reports. Confirmed lost, damaged, disposed, or reimbursed units should create appropriate inventory and financial adjustments.</P><H4 id="toc-hId--1624520697">How often does Amazon pay FBA merchants?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Amazon commonly settles merchant proceeds approximately every 14 days. The timing can vary by marketplace, account, reserve requirements, and transaction type.</P><H4 id="toc-hId--1821034202">Why does the Amazon payout not equal total product sales?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">The payout is net of customer refunds, commissions, fulfillment fees, storage charges, advertising costs, reserves, reimbursements, and other adjustments.</P><H4 id="toc-hId--2017547707">Can Amazon settlement reconciliation be fully automated?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Most order-related reconciliation can be automated when sales, returns, fees, and reimbursements are mapped correctly. Some account-level charges may still require separate postings or review.</P><H4 id="toc-hId-2080906084">Can the integration support high Amazon order volumes?</H4><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Yes. A scalable integration uses automated document creation, API processing, scheduled reconciliation, and exception management. The same consignment design can support hundreds or thousands of daily orders.</P>2026-07-23T01:30:00.973000+02:00https://community.sap.com/t5/integration-blog-posts/consuming-sap-cpi-keystore-entries-via-security-content-odata-api-part-1/ba-p/14431624Consuming SAP CPI Keystore Entries via Security Content OData API – Part 12026-07-23T07:31:34.767000+02:00Kalyanidanthahttps://community.sap.com/t5/user/viewprofilepage/user-id/1399904<H2 id="toc-hId-1819048937"><STRONG>Introduction</STRONG></H2><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;">I would like to explore how to access and consume Security Content information from SAP Cloud Integration (CI) using the CI Security Content OData API.</P><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;">In Part 1, I'll configure the required API access, generate OAuth credentials, and test the Security Content API using Postman. "The goal of this first part is simply to establish secure access to the Security Content API. Once the API call works in Postman, the same configuration can be reused inside a CPI integration flow."</P><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;">In Part 2, I'll build an SAP Cloud Integration iFlow that consumes the API, processes the response, and extracts keystore information for monitoring and reporting scenarios.</P><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;">These APIs are useful for automating certificate inventory, monitoring certificate expiry, generating reports, or integrating security metadata with external monitoring tools.</P><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;"><STRONG>Prerequisites: </STRONG>Before getting started, ensure that:</P><UL><LI>You have access to an SAP Integration Suite tenant.</LI><LI>You have permissions to create service instances and service keys in SAP BTP.</LI><LI>Postman is installed for API testing.</LI></UL><H3 id="toc-hId-1751618151">Locate the Security Content OData API</H3><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">SAP Cloud Integration exposes Security Content information through a dedicated OData API. This API provides access to security artifacts such as:</P><UL><LI>Keystore Entries</LI><LI>Certificates</LI><LI>Key Pairs</LI><LI>User Credentials</LI><LI>OAuth Credentials</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Navigate to the SAP API Business Hub and search for the Security Content API. Review the available resources and operations to understand the information exposed by the service. You can download the api collection file (OpenAPI JSON) and this can be imported directly into Postman.<BR />URL for API Hub: <A href="https://api.sap.com/api/SecurityContent/overview" target="_blank" rel="noopener noreferrer">https://api.sap.com/api/SecurityContent/overview</A></P><H3 id="toc-hId-1555104646">Create an API Instance</H3><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">To consume the Security Content API, an API service instance must be available in your SAP BTP subaccount. If an API instance has not already been created:</P><UL><LI>Navigate to your SAP BTP subaccount.</LI><LI>Open the service instances section.</LI><LI>Create a new instance for the Cloud Integration API service.</LI><LI>Complete the instance creation wizard.</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">This API instance provides secure access to the Cloud Integration APIs using OAuth 2.0 client credentials. And when creating the API instance, ensure the service instance has the required authorization. This role is required to read monitoring and security metadata from the tenant.</P><pre class="lia-code-sample language-json"><code>Required role: MonitoringDataRead</code></pre><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><STRONG>Why this matters:</STRONG> Without the proper role, requests to the Security Content API may return authorization errors such as 403 Forbidden.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1 2026-07-21 140209.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435579i8C10BC7BD2318451/image-size/large?v=v2&px=999" role="button" title="1 2026-07-21 140209.png" alt="1 2026-07-21 140209.png" /></span></P><H3 id="toc-hId-1358591141"><STRONG>Create a Service Key</STRONG></H3><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">After the API instance is created, generate a Service Key. The service key contains the OAuth credentials required by external clients such as Postman or SAP Cloud Integration to authenticate against the API.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">It contains all information needed for OAuth authentication, including:</P><UL><LI>OAuth token URL</LI><LI>Client ID</LI><LI>Client Secret</LI><LI>API endpoint URL (Base URL for the OData API)</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2 2026-07-21 140403.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435592i0CA2803C9548D0D9/image-size/large?v=v2&px=999" role="button" title="2 2026-07-21 140403.png" alt="2 2026-07-21 140403.png" /></span></P><H3 id="toc-hId-1162077636"><STRONG>Test the API Using Postman</STRONG></H3><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Import the Postman Collection called Security Content downloaded from Step1.</P><H6 id="toc-hId-1352812288"><STRONG>Add OAuth 2.0 Authentication</STRONG></H6><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Click Get New Access Token, authenticate using the client credentials, and save the generated token at the collection level so that all requests in the collection automatically inherit it.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">In the collection settings:</P><UL><LI>Auth Type: OAuth 2.0</LI><LI>Grant Type: Client Credentials</LI><LI>Access Token URL: Token URL from the service key</LI><LI>Client ID: Client ID from the service key</LI><LI>Client Secret: Client Secret from the service key</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="6 2026-07-21 142601.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435611iE5CEF35453225251/image-size/large?v=v2&px=999" role="button" title="6 2026-07-21 142601.png" alt="6 2026-07-21 142601.png" /></span></P><H6 id="toc-hId-1156298783"><STRONG>Update Collection Variables</STRONG></H6><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Update the existing <STRONG>baseUrl</STRONG> collection variable with the <STRONG>API endpoint</STRONG> from the service key. This will makes requests reusable across environments and tenants.<BR /><STRONG>baseUrl </STRONG> <A href="https://<ci" target="_blank" rel="noopener nofollow noreferrer">https://<ci-</A>api-host>/api/v1<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="7 2026-07-21 142652.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435603iFAAF2B9AA136148B/image-size/large?v=v2&px=999" role="button" title="7 2026-07-21 142652.png" alt="7 2026-07-21 142652.png" /></span></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><STRONG>Test the Keystore Entries Request: </STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Open <STRONG>Keystore Entries</STRONG> request from the collections.<BR /><STRONG>Authorization: </STRONG>Open the Authorization tab and select- "inherit auth from parent". This reuses the OAuth token configured at the collection level.<BR /><STRONG>Endpoint</STRONG>: <SPAN class=""><SPAN>{{baseUrl}}</SPAN></SPAN><SPAN>/KeystoreEntries?$select=Alias,Status,Type,ValidNotAfter,KeyType</SPAN></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="4.1 2026-07-21 142257.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435602iEF4B60ED40CC1032/image-size/large?v=v2&px=999" role="button" title="4.1 2026-07-21 142257.png" alt="4.1 2026-07-21 142257.png" /></span></SPAN></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><STRONG>Execute the Request: </STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">By default, the API returns an json OData response. you can request Atom/XML by including the appropriate <STRONG>Accept</STRONG> header as "<SPAN>application/atom+xml" If preferred</SPAN>.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Example fields include: Alias, KeyType, ValidNotAfter, Status.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="5 2026-07-21 142045.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435601i7222B1441F4101DC/image-size/large?v=v2&px=999" role="button" title="5 2026-07-21 142045.png" alt="5 2026-07-21 142045.png" /></span></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><STRONG>Lessons Learned:</STRONG></P><UL><LI>Created an independent API instance for accessing SAP CI OData services as needed.</LI><LI>Assigned the required MonitoringDataRead permission.</LI><LI>Generated a service key, Configured and verified OAuth 2.0 authentication in Postman and can be used in CI as is smoothly.</LI><LI>Verified that the API's are accessible using OAuth 2.0 and able to receive the data in XML or Json</LI></UL><H5 id="toc-hId-830702559">What can be better:</H5><UL><LI>what I notice is that the OData couldn't able to filter the records using "<SPAN>ValidNotAfter</SPAN>" fields, it could be very useful if it works so that I do not have to use extra functions to filter the data & the same time reducing the amount records into CI Runtime, means smaller payloads.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="8 2026-07-21 143938.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435615iFD58CE3648AE8660/image-size/large?v=v2&px=999" role="button" title="8 2026-07-21 143938.png" alt="8 2026-07-21 143938.png" /></span> </LI></UL>2026-07-23T07:31:34.767000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/integrating-github-with-sap-integration-suite-a-complete-guide-to-version/ba-p/14444055Integrating GitHub with SAP Integration Suite: A Complete Guide to Version Control and DevOps2026-07-23T13:13:32.794000+02:00Souragopalhttps://community.sap.com/t5/user/viewprofilepage/user-id/2026623<H1 id="toc-hId-1690973440">Connect GitHub with SAP Integration Suite (Cloud Integration)</H1><H2 id="toc-hId-1623542654">Introduction</H2><P><BR />During my recent work with SAP Integration Suite, I looked into the built-in GitHub integration feature in Cloud Integration. While handling integration projects, I noticed that keeping track of version history, collaborating with several developers, and retrieving previous versions of integration artifacts became difficult when those artifacts were only managed within the tenant. This made me want to explore GitHub integration and see how it connects SAP Integration Suite development with current DevOps practices.</P><P>This blog shares my firsthand experience setting up GitHub with SAP Integration Suite. I detail each configuration step and offer practical insights and useful tips I discovered during the implementation.<BR /><BR />Why GitHub Integration?<BR />GitHub integration provides version control, collaboration, traceability, backup, governance, and CI/CD readiness for SAP Integration Suite artifacts. Teams can manage iFlows, script collections, and other related artifacts using familiar Git workflows.</P><P>By integrating GitHub with SAP Integration Suite, organizations can:</P><UL><LI><P>Maintain version history of integration artifacts.</P></LI><LI><P>Enable collaboration among multiple developers.</P></LI><LI><P>Support branching and release management strategies.</P></LI><LI><P>Implement CI/CD pipelines.</P></LI><LI><P>Maintain backup and recovery mechanisms.</P></LI><LI><P>Improve governance and auditability of changes.</P></LI></UL><P>In this blog, we will walk through the complete process of:</P><UL><LI><P>Creating a GitHub Personal Access Token.</P></LI><LI><P>Creating and configuring a GitHub repository.</P></LI><LI><P>Establishing connectivity between SAP Integration Suite and GitHub.</P></LI><LI><P>Performing Git operations such as Push, Pull, and Import.</P></LI><LI><P>Understanding best practices for managing integration artifacts using Git.</P></LI></UL><H1 id="toc-hId-1297946430">Why Use GitHub with SAP Integration Suite?</H1><P>Traditionally, integration artifacts were managed directly within SAP Integration Suite, making collaboration and version management challenging in larger projects.</P><P>Git integration solves these challenges by introducing capabilities such as:</P><P>Feature Benefit</P><TABLE><TBODY><TR><TD>Version Control</TD><TD>Track every modification to integration artifacts</TD></TR><TR><TD>Collaboration</TD><TD>Multiple developers can work simultaneously</TD></TR><TR><TD>Backup & Recovery</TD><TD>Repository acts as a central backup</TD></TR><TR><TD>Governance</TD><TD>Better control using branching strategies</TD></TR><TR><TD>Auditability</TD><TD>Complete history of changes</TD></TR><TR><TD>CI/CD Integration</TD><TD>Enables automated deployment pipelines</TD></TR></TBODY></TABLE><P>Git integration becomes extremely useful in enterprise projects where multiple developers work across various environments such as DEV, QA, UAT, and PROD.</P><H1 id="toc-hId-1101432925">Architecture Overview</H1><PRE><CODE>SAP Integration Suite (Cloud Integration)
|
| HTTPS + Personal Access Token
|
GitHub Repository
|
----------------------
| | |
main develop feature/*</CODE></PRE><P>Integration artifacts such as Integration Flows, Script Collections, Value Mappings, and Message Mappings are stored inside Git repositories and can be synchronized between SAP Integration Suite and GitHub.</P><H1 id="toc-hId-904919420">Prerequisites</H1><P>Before proceeding, ensure the following prerequisites are met.</P><H2 id="toc-hId-837488634">SAP Prerequisites</H2><UL><LI><P>Access to SAP Integration Suite – Cloud Integration.</P></LI><LI><P>User must have the <STRONG>PI_Administrator</STRONG> role assigned.</P></LI><LI><P>Appropriate authorizations to create and modify integration artifacts.</P></LI></UL><H2 id="toc-hId-640975129">GitHub Prerequisites</H2><UL><LI><P>A valid GitHub account.</P></LI><LI><P>Internet connectivity to access GitHub.</P></LI><LI><P>Permission to create repositories and generate Personal Access Tokens.</P></LI></UL><H1 id="toc-hId-315378905">Step 1 – Create a Personal Access Token in GitHub</H1><P>SAP Integration Suite communicates with GitHub using Git APIs. Since GitHub no longer supports password-based authentication for Git operations, authentication must be performed using a <STRONG>Personal Access Token (PAT)</STRONG>.</P><P>The Personal Access Token acts as a secure credential that authorizes SAP Integration Suite to perform operations such as:</P><UL><LI><P>Read repository information</P></LI><LI><P>Push integration artifacts</P></LI><LI><P>Pull latest changes</P></LI><LI><P>Import artifacts from repositories</P></LI></UL><HR /><H2 id="toc-hId-247948119">Navigate to GitHub Settings</H2><P>Login to GitHub and navigate to:</P><PRE><CODE>Profile → Settings</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_0-1784539191687.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434951i6C7D555CBCC81F61/image-size/medium?v=v2&px=400" role="button" title="Souragopal_0-1784539191687.png" alt="Souragopal_0-1784539191687.png" /></span></P><P> </P><H2 id="toc-hId-51434614">Open Developer Settings</H2><P>Navigate to:</P><PRE><CODE>Settings → Developer Settings</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_1-1784539216755.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434952iAC1757D49A5C548A/image-size/medium?v=v2&px=400" role="button" title="Souragopal_1-1784539216755.png" alt="Souragopal_1-1784539216755.png" /></span></P><P> </P><H2 id="toc-hId-202175466">Create a Personal Access Token</H2><P>Navigate to:</P><PRE><CODE>Personal Access Tokens → Tokens (Classic)</CODE></PRE><P>Click:</P><PRE><CODE>Generate New Token (Classic)</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_2-1784539279035.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434954i062997C8AC57979C/image-size/medium?v=v2&px=400" role="button" title="Souragopal_2-1784539279035.png" alt="Souragopal_2-1784539279035.png" /></span></P><P> </P><H2 id="toc-hId-5661961">Configure the Token</H2><P>Provide:</P><UL><LI><P>Token Name</P></LI><LI><P>Expiration Date</P></LI><LI><P>Required Permissions (Scopes)</P></LI></UL><P>For testing purposes, all repository-related scopes can be selected. However, in productive environments, it is recommended to grant only the minimum permissions required by following the <STRONG>Principle of Least Privilege (PoLP)</STRONG>.</P><P>Typical scopes include:</P><UL><LI><P>repo</P></LI><LI><P>workflow</P></LI><LI><P>read:org</P></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_3-1784539316567.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434956iDB9B2E1F6EC3AECF/image-size/medium?v=v2&px=400" role="button" title="Souragopal_3-1784539316567.png" alt="Souragopal_3-1784539316567.png" /></span></P><H2 id="toc-hId--190851544">Important Note</H2><P>The generated token is displayed only once by GitHub.</P><BLOCKQUOTE><P>Ensure that you copy and securely store the token because it cannot be viewed again once the page is closed.</P></BLOCKQUOTE><P>This token will be used while configuring Git access in SAP Integration Suite.</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_4-1784539381799.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434958iDF94EE39B6FACE6A/image-size/medium?v=v2&px=400" role="button" title="Souragopal_4-1784539381799.png" alt="Souragopal_4-1784539381799.png" /></span></P><P> </P><H1 id="toc-hId--93962042">Step 2 – Create a Repository</H1><P>A Git repository acts as the central storage location for all integration artifacts.</P><P>Every time an artifact is pushed from SAP Integration Suite, GitHub stores:</P><UL><LI><P>Source code</P></LI><LI><P>Version history</P></LI><LI><P>Commit information</P></LI><LI><P>Metadata</P></LI><LI><P>Change logs</P></LI></UL><P>This repository can then be used for:</P><UL><LI><P>Collaboration</P></LI><LI><P>Backup</P></LI><LI><P>Recovery</P></LI><LI><P>Audit purposes</P></LI><LI><P>CI/CD integration</P></LI></UL><P>Navigate to the GitHub home page and click:</P><PRE><CODE>New Repository</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_5-1784539410253.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434960i9C5806DD73CD54D0/image-size/medium?v=v2&px=400" role="button" title="Souragopal_5-1784539410253.png" alt="Souragopal_5-1784539410253.png" /></span></P><P>Provide:</P><UL><LI><P>Repository Name</P></LI><LI><P>Description</P></LI><LI><P>Visibility (Public or Private)</P></LI></UL><P>For enterprise projects, it is recommended to use <STRONG>Private repositories</STRONG> since integration artifacts may contain business logic and sensitive information.</P><P>Example:</P><PRE><CODE>SAP-CPI-Integration-Artifacts</CODE></PRE><H1 id="toc-hId--290475547">Step 3 – Create a Branch</H1><P>Git uses branches to isolate development activities.</P><P>Since SAP Integration Suite performs operations against a particular branch, at least one branch must exist.</P><P>The easiest way to create the default branch is:</P><OL><LI><P>Create a README file.</P></LI><LI><P>Commit the file.</P></LI></OL><P>GitHub automatically creates the <STRONG>main</STRONG> branch.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_6-1784539469114.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434962iC252A69BC3BCA107/image-size/medium?v=v2&px=400" role="button" title="Souragopal_6-1784539469114.png" alt="Souragopal_6-1784539469114.png" /></span></P><P> </P><P> </P><H2 id="toc-hId--780392059">Why Branching is Important</H2><P>A proper branching strategy enables:</P><UL><LI><P>Parallel development</P></LI><LI><P>Controlled releases</P></LI><LI><P>Easier rollback</P></LI><LI><P>Better governance</P></LI><LI><P>Reduced conflicts</P></LI></UL><P>A typical enterprise branching strategy looks like:</P><P>Branch Purpose</P><TABLE><TBODY><TR><TD>main</TD><TD>Production-ready artifacts</TD></TR><TR><TD>develop</TD><TD>Integration testing</TD></TR><TR><TD>feature/*</TD><TD>Development activities</TD></TR><TR><TD>release</TD><TD>Pre-production validation</TD></TR><TR><TD>hotfix</TD><TD>Production bug fixes</TD></TR></TBODY></TABLE><H1 id="toc-hId--683502557">GitHub Setup Completed</H1><P>At this stage, we have successfully completed all the necessary configurations on GitHub.</P><P>The next step is to establish connectivity between GitHub and SAP Integration Suite.</P><H1 id="toc-hId--880016062">Step 4 – Configure Git Access in SAP Integration Suite</H1><P>Navigate to:</P><PRE><CODE>Settings → Git Repositories</CODE></PRE><P>SAP Integration Suite provides a centralized location for managing Git repository connections.</P><P>As of now, SAP Integration Suite allows configuring up to <STRONG>50 Git repository connections</STRONG>.</P><P>This capability is useful when organizations maintain:</P><UL><LI><P>Project-specific repositories</P></LI><LI><P>Shared repositories</P></LI><LI><P>Customer-specific repositories</P></LI><LI><P>Environment-specific repositories</P></LI></UL><P>Click:</P><PRE><CODE>Edit → Add</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_7-1784539519351.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434963i391EBE6471A7E17D/image-size/medium?v=v2&px=400" role="button" title="Souragopal_7-1784539519351.png" alt="Souragopal_7-1784539519351.png" /></span></P><P>Provide:</P><P>Field Value</P><TABLE><TBODY><TR><TD>Repository URL</TD><TD>GitHub Repository URL</TD></TR><TR><TD>Access Token</TD><TD>GitHub Personal Access Token</TD></TR></TBODY></TABLE><P>Click:</P><PRE><CODE>Add → Save</CODE></PRE><P>Once saved, SAP Integration Suite validates the credentials and establishes a secure connection with GitHub.</P><H1 id="toc-hId--1076529567">Git Operations in SAP Integration Suite</H1><P>After the repository connection is established, SAP Integration Suite supports three major Git operations:</P><OL><LI><P>Git Push</P></LI><LI><P>Git Pull</P></LI><LI><P>Git Import</P></LI></OL><H1 id="toc-hId--1273043072">Git Push</H1><P>The Git Push operation uploads integration artifacts from SAP Integration Suite into GitHub.</P><P>This operation is generally performed when:</P><UL><LI><P>A new artifact is created.</P></LI><LI><P>Existing artifacts are modified.</P></LI><LI><P>Development work is completed.</P></LI><LI><P>Changes need to be backed up.</P></LI></UL><P>Navigate to:</P><PRE><CODE>Actions → Git Push</CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_8-1784539555499.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434965iEAE5FE8F81396858/image-size/medium?v=v2&px=400" role="button" title="Souragopal_8-1784539555499.png" alt="Souragopal_8-1784539555499.png" /></span></P><P> </P><P>Provide:</P><UL><LI><P>Access Token</P></LI><LI><P>Repository</P></LI><LI><P>Branch</P></LI><LI><P>Commit Message</P></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_9-1784539578061.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434967i5CF3D573AFC0A4E3/image-size/medium?v=v2&px=400" role="button" title="Souragopal_9-1784539578061.png" alt="Souragopal_9-1784539578061.png" /></span></P><P> </P><P>Example commit messages:</P><PRE><CODE>Initial version of Customer Integration Interface</CODE></PRE><PRE><CODE>Added retry mechanism for SFTP processing</CODE></PRE><PRE><CODE>Enhanced mapping for Sales Order Interface</CODE></PRE><H2 id="toc-hId--1594775893">Benefits of Git Push</H2><UL><LI><P>Creates version history.</P></LI><LI><P>Enables collaboration.</P></LI><LI><P>Maintains backup.</P></LI><LI><P>Supports CI/CD pipelines.</P></LI><LI><P>Improves governance.</P></LI></UL><P>After a successful push, Git information becomes visible in the integration artifact.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_10-1784539684496.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434972i407740DC8C122FCE/image-size/medium?v=v2&px=400" role="button" title="Souragopal_10-1784539684496.png" alt="Souragopal_10-1784539684496.png" /></span></P><H1 id="toc-hId--1497886391">Git Pull</H1><P>Git Pull is used to synchronize the latest version of the artifact from GitHub into SAP Integration Suite.</P><P>This is useful when:</P><UL><LI><P>Another developer has modified the artifact.</P></LI><LI><P>Changes have been merged into the repository.</P></LI><LI><P>Local artifacts need to be updated.</P></LI></UL><P>Navigate to:</P><PRE><CODE>Actions → Git Pull</CODE></PRE><P>Provide:</P><UL><LI><P>Access Token</P></LI><LI><P>Repository</P></LI><LI><P>Branch</P></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_11-1784539716085.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434974i1ED6020C7B55E12E/image-size/medium?v=v2&px=400" role="button" title="Souragopal_11-1784539716085.png" alt="Souragopal_11-1784539716085.png" /></span></P><P> </P><P> </P><H2 id="toc-hId--1987802903">Important Consideration</H2><P>Pull operations can fail due to version conflicts.</P><P>For example:</P><UL><LI><P>Local artifact is already modified.</P></LI><LI><P>Repository version is different.</P></LI><LI><P>Local version is ahead of repository version.</P></LI></UL><P>Therefore, it is recommended to perform Pull operations regularly before starting development.</P><H1 id="toc-hId--1890913401">Git Import</H1><P>Git Import allows developers to import artifacts directly from Git repositories into another package or tenant.</P><P>This feature is extremely useful in scenarios such as:</P><H3 id="toc-hId-1620734376">Tenant Migration</H3><P>Moving integration artifacts between tenants.</P><H3 id="toc-hId-1424220871">Reusability</H3><P>Importing common frameworks and templates.</P><H3 id="toc-hId-1227707366">Project Onboarding</H3><P>New team members can quickly access existing interfaces.</P><H3 id="toc-hId-1031193861">Disaster Recovery</H3><P>Rebuilding an Integration Suite tenant from repository content.</P><P>Navigate to:</P><PRE><CODE>Actions → Git Import</CODE></PRE><P>Provide:</P><UL><LI><P>Access Token</P></LI><LI><P>Repository</P></LI><LI><P>Branch</P></LI></UL><P>SAP Integration Suite displays all available artifacts in the selected branch.</P><P>Choose:</P><UL><LI><P>Add</P></LI><LI><P>Add and Open in Editor</P></LI></UL><P>depending on your requirement.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Souragopal_12-1784539754632.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434975iF33ABF1A8873386B/image-size/medium?v=v2&px=400" role="button" title="Souragopal_12-1784539754632.png" alt="Souragopal_12-1784539754632.png" /></span></P><P> </P><H1 id="toc-hId-1421486370">Recommended Git Strategy for SAP Integration Suite</H1><P>A recommended branching model is:</P><PRE><CODE>main → Production
release → UAT
develop → SIT
feature/* → Development</CODE></PRE><P>This approach provides:</P><UL><LI><P>Better governance</P></LI><LI><P>Parallel development</P></LI><LI><P>Easier rollback</P></LI><LI><P>Controlled deployments</P></LI><LI><P>Reduced production risks<BR /><BR /></P></LI></UL><H2 id="toc-hId-931569858"><SPAN>My Experience</SPAN></H2><P><SPAN>While testing the feature, I initially created an empty repository and found that Git operations failed because no branch existed. Creating and committing a README file automatically generated the main branch and resolved the issue. I also found that meaningful commit messages and feature branches significantly improve collaboration when multiple developers work on the same integration package.<BR /><BR /></SPAN></P><H3 id="toc-hId-609837037">Practical Tips from My Testing</H3><P>Based on my testing, here are a few recommendations:</P><UL><LI>Verify that the Personal Access Token has the required repository permissions before configuring the connection.</LI><LI>Ensure the repository already contains a valid branch before attempting Git operations.</LI><LI>Use meaningful commit messages to simplify future troubleshooting and change tracking.</LI><LI>Perform a Git Pull before starting development if multiple developers are working on the same artifact.</LI><LI>Use feature branches instead of developing directly on the main branch for better version control and collaboration.</LI></UL><H2 id="toc-hId-706726539"> </H2><H1 id="toc-hId-803616041">Conclusion</H1><P>Exploring GitHub integration with SAP Integration Suite gave me a better understanding of how version control can be seamlessly incorporated into the integration development lifecycle. The feature not only simplifies collaboration among developers but also introduces better governance, traceability, and backup capabilities for integration artifacts.</P><P>Although the initial setup requires a few configuration steps, once completed, Git operations such as Push, Pull, and Import become straightforward and significantly improve day-to-day development activities. I hope the steps and practical observations shared in this blog help others configure GitHub integration more efficiently and encourage them to adopt version control as part of their SAP Integration Suite development process.</P><P><SPAN>Special thanks to</SPAN> <SPAN><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/2319698">@ShraddhaDas151</a> </SPAN> <SPAN>for the continuous support, guidance, and valuable insights that contributed to the preparation </SPAN><SPAN>of this blog.<BR /></SPAN><BR /><SPAN>Thank you for reading this blog. Feel free to share your feedback, suggestions, or questions in the comments section below. Your</SPAN><BR /><SPAN>inputs are highly appreciated and contribute to continuous l</SPAN></P>2026-07-23T13:13:32.794000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/revamped-documentation-for-sap-integration-suite/ba-p/14448199Revamped Documentation for SAP Integration Suite2026-07-24T15:43:32.318000+02:00MelanieCueppershttps://community.sap.com/t5/user/viewprofilepage/user-id/125586<P><SPAN>Navigating complex software documentation can be challenging, especially when a product offers as many capabilities as SAP Integration Suite. </SPAN>After many years of growth, t<SPAN>hat's why our User Assistance team for SAP Integration Suite decided it was time for a change.</SPAN></P><P><SPAN>We, that is, the authors of the help documents for SAP Integration Suite, have <STRONG>revamped the documentation structure</STRONG>. You'll now find a streamlined main hub that connects you directly to individual capability guides. Simply click the capability name to jump off to the area you need – whether that's API Management, Integration Advisor, or any other capability of SAP Integration Suite. </SPAN></P><P>Curious? Get exploring right away: <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/" target="_blank" rel="noopener noreferrer">SAP Integration Suite</A></P><P><EM><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="GIF showing navigation from Integration Suite to Trading Partner Management guide" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/436968iD023D84DB36673D3/image-size/medium?v=v2&px=400" role="button" title="GIF New Structure.gif" alt="GIF showing navigation from Integration Suite to Trading Partner Management guide" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">GIF showing navigation from Integration Suite to Trading Partner Management guide</span></span></SPAN></EM></P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P><STRONG><SPAN>What This Means For You </SPAN></STRONG></P><UL><LI><STRONG><SPAN>Slimmer guides</SPAN></STRONG><SPAN> with flatter hierarchies - less scrolling and searching</SPAN></LI><LI><STRONG><SPAN>Faster navigation</SPAN></STRONG><SPAN> gets you to the right information quickly</SPAN></LI><LI><STRONG><SPAN>Focused content</SPAN></STRONG><SPAN> shows only what's relevant to your current task</SPAN></LI></UL><P><SPAN>... all with the same quality and surrounded by the modern look of our SAP Help Portal. </SPAN><span class="lia-unicode-emoji" title=":glowing_star:">🌟</span></P><P><STRONG>Take Action</STRONG></P><P><SPAN>Ready to explore? Head over to the new documentation structure and see the difference for yourself. Just remember to update your bookmarks to your favorite pages.</SPAN></P><P><SPAN>Let us know how you like the changes! </SPAN></P><P>By the way, are you already collaboration with us? Thanks to our Open Documentation collaboration process, you can give feedback and raise issues about the documentation using GitHub. Learn more about it in under <SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/collaborate-with-us-on-the-migration-guide-for-sap-process-orchestration/ba-p/13524683" target="_blank">Collaborate with us on the Migration Guide for SAP Process Orchestration!</A></SPAN></P><P>Happy exploring!</P>2026-07-24T15:43:32.318000+02:00