https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/Cloud-Integration-blog-posts.xml SAP Community - Cloud Integration 2026-04-22T20:00:07.452477+00:00 python-feedgen Cloud Integration blog posts in SAP Community https://community.sap.com/t5/technology-blog-posts-by-members/architecting-electronic-bill-of-lading-on-sap-btp-blueprint-part-2-of-3/ba-p/14352463 Architecting Electronic Bill of Lading on SAP BTP - Blueprint (Part 2 of 3) 2026-04-02T00:23:19.930000+02:00 RodrigoCampos https://community.sap.com/t5/user/viewprofilepage/user-id/1638903 <H2 id="ember657" id="toc-hId-1792294820">Introduction</H2><P><SPAN>In <A title="https://www.linkedin.com/pulse/proof-concept-architecting-electronic-bill-lading-sap-rodrigo-campos-y8jae/?trackingId=Rqm4JTaLhlQhyU1r0q55dg%3D%3D" href="https://community.sap.com/t5/technology-blog-posts-by-members/architecting-electronic-bill-of-lading-on-sap-btp-rethinking-paper-based/ba-p/14352377" target="_blank"><EM><STRONG>Part 1 </STRONG></EM></A>, we explored the transformative potential of the Electronic Bill of Lading in international trade, highlighting its impact on sustainability, enhanced supply chain transparency, and accelerated business processes.</SPAN></P><P class=""><STRONG>Part 2</STRONG> presents the building blocks used to implement the solution and includes an architecture diagram illustrating how the SAP BTP services and components are integrated.</P><P class="">&nbsp;</P><H3 id="ember301" id="toc-hId-1724864034">1. System Context</H3><HR /><P class="">The ocean carrier already operates an established core system that manages transactional data such as bookings, shipping instructions, and transport events on <STRONG>SAP Cloud ERP( S/4HANA Transportation Management)</STRONG>.</P><P class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SAP Cloud ERP" style="width: 723px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385612iF0836CB8A1291D10/image-dimensions/723x423?v=v2" width="723" height="423" role="button" title="SAPTM.png" alt="SAP Cloud ERP" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">SAP Cloud ERP</span></span></P><DIV class="">&nbsp;</DIV><H3 id="ember304" id="toc-hId-1528350529">2. SAP Business Technology Platform</H3><HR /><P class="">The foundation of this solution is <STRONG>SAP BTP</STRONG>, a cloud platform that brings together application development, data management, integration, and AI capabilities. It provides the core infrastructure and services needed to build enterprise applications.</P><P class="">To support the transition to digital trade, the <STRONG>Electronic Bill of Lading</STRONG> capability is implemented on <STRONG>SAP BTP&nbsp;</STRONG>as a side-by-side extension.</P><P class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-14 at 5.34.23 PM.png" style="width: 728px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385614i63A9BCDFE3183199/image-dimensions/728x311?v=v2" width="728" height="311" role="button" title="Screenshot 2026-03-14 at 5.34.23 PM.png" alt="Screenshot 2026-03-14 at 5.34.23 PM.png" /></span></P><DIV class="">&nbsp;</DIV><H3 id="ember308" id="toc-hId-1331837024">3. Electronic Bill of Lading: TradeTrust Framework</H3><HR /><P class="" data-unlink="true">The open-source <STRONG>TradeTrust</STRONG>&nbsp;<STRONG>Framework</STRONG>&nbsp; serve as the foundation for implementing a fully digital and verifiable Electronic Bill of Lading solution. It can be deployed as a <STRONG>Node.js </STRONG>application on<STRONG>&nbsp;Cloud Foundry</STRONG>, which provides the runtime for developing and running cloud-native applications on SAP BTP.</P><P class="">On this PoC, the TradeTrust framework uses the <STRONG>Ethereum blockchain</STRONG> whereby the ERC-721 provides a widely-used smart contract API used on non-fungible tokens (NFTs) to allow transfer of ownership whilst providing assurance of integrity, singularity, and control.</P><P class=""><EM>Blockchain technology is a decentralized digital ledger system that records and verifies transactions across a network of computers in a secure and transparent manner. It consists of a chain of blocks, each containing a list of transactions thatare linked and secured using cryptographic techniques. Once a block is added to the chain, its data become immutable through a distributed ledger system, ensuring the integrity and permanence of the transaction records. This immutability and transparency enable blockchain to facilitate the exchange of anything of value, whether tangible assets including physical goods or intangible items such as digital assets.</EM>[11]</P><DIV class="">&nbsp;</DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773346306937.png" style="width: 705px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385615i28B16B6DAA4E9A90/image-dimensions/705x381?v=v2" width="705" height="381" role="button" title="1773346306937.png" alt="1773346306937.png" /></span></DIV><H3 id="ember313" id="toc-hId-1135323519">4. Terminal Operating System</H3><HR /><P class=""><STRONG>Terminal Operating System (TOS)</STRONG> is the port terminal’s operational platform that manage and monitor container and vessel activities. Leveraging IoT-enabled equipment and sensors, the TOS generates real-time operational events such as container loading, vessel arrival, and departure. These events are distributed through a publish–subscribe model, pushing notifications to a configured endpoint. To ensure authenticity and integrity, the messages are encrypted and digitally signed.</P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773191371504.png" style="width: 702px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385616i22C4075C98EF6D5A/image-dimensions/702x268?v=v2" width="702" height="268" role="button" title="1773191371504.png" alt="1773191371504.png" /></span></DIV><H3 id="ember316" id="toc-hId-938810014">5. Event-Driven Architecture</H3><HR /><P class=""><STRONG>SAP Integration Suite</STRONG> running on <STRONG>SAP BTP</STRONG> provides the capabilities that enable Event-Driven Architecture within the solution. The <STRONG>Cloud Integration </STRONG>is the middleware layer responsible for routing, transforming, and exchanging messages between external systems and SAP services. Under the hood, it uses the open-source <STRONG>Apache Camel Framework</STRONG>, enabling integration flows based on enterprise integration patterns.</P><P class="">For event orchestration <STRONG>SAP Event Mesh</STRONG> is the message broker, it facilitates asynchronous communication by receiving events from the terminal/port and routing them to the subscribed consumer <STRONG>Events-To-Business Actions Framework</STRONG>, that leverages the decisions capability of <STRONG>SAP Build Process Automation</STRONG> to initiate business actions.</P><DIV class="">&nbsp;</DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773329195065.png" style="width: 807px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385617i7A384850AC096ABD/image-dimensions/807x191?v=v2" width="807" height="191" role="button" title="1773329195065.png" alt="1773329195065.png" /></span></DIV><H3 id="ember320" id="toc-hId-742296509">6. Automation</H3><HR /><P class="" data-unlink="true">For the process automation, a workflow is managed on <A href="https://www.sap.com/products/technology-platform/process-automation.html" target="_self" rel="noopener noreferrer">SAP Build Process Automation&nbsp;</A></P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1772558372788.png" style="width: 698px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385618i2B992165C10D49D1/image-dimensions/698x580?v=v2" width="698" height="580" role="button" title="1772558372788.png" alt="1772558372788.png" /></span></DIV><DIV class="">&nbsp;</DIV><H3 id="ember323" id="toc-hId-545783004">7. UI</H3><HR /><P class="">Stakeholders access the application through SAP Build Work Zone, where authentication is handled by SAP Cloud Identity Services integrated with a custom Identity Provider (IdP) that validates blockchain wallet signatures. Authorization is then enforced via role collections, ensuring access only to permitted functionalities.</P><P class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1772502965037.png" style="width: 753px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385620i4439626CB9B1DF25/image-dimensions/753x199?v=v2" width="753" height="199" role="button" title="1772502965037.png" alt="1772502965037.png" /></span></P><P class="">&nbsp;</P><H3 id="ember326" id="toc-hId-349269499">8. Diagram</H3><HR /><OL><LI>The <STRONG>Terminal Operating System</STRONG> generates an operational event(<EM>Load</EM>, <EM>Departure, Arrival</EM>). The event is published to the event broker <STRONG>SAP Event Mesh.</STRONG></LI><LI><STRONG>Event-to-Business-Actions framework</STRONG> is subscribed to <STRONG>SAP Event Mesh</STRONG> topics to receive the events.</LI><LI>Based on the rule outcome, the processor triggers a workflow on <STRONG>SAP Build Process Automation</STRONG> to orchestrate the business process.</LI><LI>The workflow calls <STRONG>SAP Integration Suite</STRONG> to start the process.</LI><LI>An Integration Flow retrieves the required Ocean Freight Booking from <STRONG>SAP S/4HANA</STRONG> and builds the payload to issue the eBL.</LI><LI>The Integration Flow invokes the <STRONG>TradeTrust Framework</STRONG>.</LI><LI>The <STRONG>Electronic Bill of Lading</STRONG> is issued on Ethereum Network.</LI></OL><P>&nbsp;</P><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773356166354.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385621i49D29577F4A198E8/image-size/large?v=v2&amp;px=999" role="button" title="1773356166354.png" alt="1773356166354.png" /></span></DIV><H3 id="ember329" id="toc-hId-152755994">9. Data Context</H3><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773457469947.png" style="width: 731px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385622i97B2221B8F162107/image-dimensions/731x238?v=v2" width="731" height="238" role="button" title="1773457469947.png" alt="1773457469947.png" /></span></P><P>&nbsp;</P><H2 id="ember135" id="toc-hId-174414127">Conclusion:</H2><P><SPAN>Part 2 outlined the essential building blocks and architectural components for implementing the eBL solution on SAP Business Technology Platform.</SPAN></P><P class=""><EM>In <STRONG><A title="https://community.sap.com/t5/technology-blog-posts-by-members/architecting-electronic-bill-of-lading-on-sap-btp-end-to-end-scenario-part/ba-p/14352514" href="https://community.sap.com/t5/technology-blog-posts-by-members/architecting-electronic-bill-of-lading-on-sap-btp-end-to-end-scenario-part/ba-p/14352514" target="_blank">Part 3</A></STRONG></EM><EM>,</EM> I’ll walk through a complete end-to-end global trade scenario, illustrating how the architecture operates in practice, from container loading event to eBL issuance, ownership transfer, and final surrender.</P> 2026-04-02T00:23:19.930000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/architecting-electronic-bill-of-lading-on-sap-btp-end-to-end-scenario-part/ba-p/14352514 Architecting Electronic Bill of Lading on SAP BTP - End-to-End Scenario(Part 3 of 3) 2026-04-02T19:09:58.380000+02:00 RodrigoCampos https://community.sap.com/t5/user/viewprofilepage/user-id/1638903 <H2 id="ember657" id="toc-hId-1792295627">Introduction</H2><P><SPAN>In <A title="https://www.linkedin.com/pulse/proof-concept-architecting-electronic-bill-lading-sap-rodrigo-campos-y8jae/?trackingId=Rqm4JTaLhlQhyU1r0q55dg%3D%3D" href="https://community.sap.com/t5/technology-blog-posts-by-members/architecting-electronic-bill-of-lading-on-sap-btp-rethinking-paper-based/ba-p/14352377" target="_blank"><EM><STRONG>Part 1 – Case Study</STRONG></EM></A> and <EM><STRONG><A title="" href="https://community.sap.com/t5/technology-blog-posts-by-members/architecting-electronic-bill-of-lading-on-sap-btp-blueprint-part-2-of-3/ba-p/14352463" target="_blank">Part 2 – Blueprint</A></STRONG></EM>, we introduced the concept of the Electronic Bill of Lading and walked through the key steps required for its implementation.</SPAN></P><P class="">The <STRONG>Part 3</STRONG> presents a complete end-to-end global trade scenario, beginning with a container loading event emitted by the Terminal Operating System, continuing through the issuance of the <STRONG>electronic Bill of Lading,</STRONG> and ending with the surrender of the eBL when the importer claims the goods.</P><H3 id="ember281" id="toc-hId-1724864841">Teaser</H3><P class="" data-unlink="true">The recently announced <STRONG>trade agreement between the European Union and Mercosur&nbsp;</STRONG>(January 2026) opens new opportunities for smaller producers to gain greater market access and visibility in cross-border commerce. Additionally, the European Union will contribute with €1.8 billion through the Global Gateway&nbsp; initiative to support Mercosur’s green and digital transition. As trade volumes grow, <STRONG>Electronic Bills of Lading </STRONG>help by enabling faster, more secure, and fully digital handling of one of the most important documents in international trade.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="mercosur-trade-agreement.png" style="width: 592px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385658i563285FA9B82CB22/image-dimensions/592x333?v=v2" width="592" height="333" role="button" title="mercosur-trade-agreement.png" alt="mercosur-trade-agreement.png" /></span></P><P>&nbsp;</P><H2 id="ember284" id="toc-hId-1399268617">Scenario</H2><HR /><P class="">A Brazilian<STRONG> Coffee Exporter</STRONG> contracts an <STRONG>Ocean Carrier</STRONG> to ship a container of coffee beans to an European<STRONG> Coffee Importer:</STRONG></P><UL><LI><STRONG>Stakeholders</STRONG>: Buyer, Seller and Carrier</LI><LI><STRONG>Origen</STRONG>: Port of Santos, Brazil</LI><LI><STRONG>Destination</STRONG>: &nbsp;Port of Antwerp, Belgium</LI><LI><STRONG>Goods</STRONG>: Arabica Coffee Beans</LI><LI><STRONG>Amount</STRONG>: 18 tons</LI><LI><STRONG>Container</STRONG>: 1 TEU</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RodrigoCampos_0-1774029071989.png" style="width: 598px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/386993i9825B1023E51A42D/image-dimensions/598x396?v=v2" width="598" height="396" role="button" title="RodrigoCampos_0-1774029071989.png" alt="RodrigoCampos_0-1774029071989.png" /></span></P><P>&nbsp;</P><H3 id="ember288" id="toc-hId-1331837831">Booking Request</H3><HR /><P class="">The exporter requests transportation from the ocean carrier by submitting a <STRONG>booking request</STRONG>.</P><P class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773671736259.png" style="width: 652px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385661i9F9F589A0B6973BE/image-dimensions/652x411?v=v2" width="652" height="411" role="button" title="1773671736259.png" alt="1773671736259.png" /></span></P><P class=""><SPAN>The booking page of the app call the</SPAN><STRONG> <A class="" href="https://api.sap.com/api/CE_FREIGHTBOOKING_0001/overview" target="_self" rel="noopener noreferrer">FREIGHTBOOKING</A></STRONG> <A class="" href="https://api.sap.com/api/CE_FREIGHTBOOKING_0001/overview" target="_self" rel="noopener noreferrer"><STRONG>API</STRONG></A> <SPAN>to create the Ocean Booking on</SPAN> <STRONG>SAP Cloud ERP</STRONG></P><P class=""><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="booking2.png" style="width: 796px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385662iE6BD3165BF710E2F/image-dimensions/796x433?v=v2" width="796" height="433" role="button" title="booking2.png" alt="booking2.png" /></span></STRONG></P><H3 id="ember293" id="toc-hId-1135324326">Stakeholder Onboarding</H3><P class="">Before the shipment process begins, key participants such as the exporter, importer, and carrier are onboarded to the platform. During this step, each party registers its digital identity and public key, enabling secure signing, verification, and ownership transfer of the Electronic Bill of Lading.</P><P class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773671926780.png" style="width: 791px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385665i4D222B9F465AB200/image-dimensions/791x358?v=v2" width="791" height="358" role="button" title="1773671926780.png" alt="1773671926780.png" /></span></P><H2 id="ember296" id="toc-hId-809728102">Electronic Bill of Lading Lifecycle</H2><HR /><P class="">The eBL lifecycle is based on the events generated by the <STRONG>Terminal Operating System:</STRONG></P><P class=""><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773694975142.png" style="width: 805px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385669i83310ED848E774D5/image-dimensions/805x485?v=v2" width="805" height="485" role="button" title="1773694975142.png" alt="1773694975142.png" /></span></STRONG></P><H3 id="ember76" id="toc-hId-742297316">1. Event: Load</H3><HR /><P class=""><STRONG>Port/Terminal Operating System:</STRONG> confirms the container has been loaded on a vessel</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RodrigoCampos_1-1774029113223.png" style="width: 635px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/386994iA85C50DD3441DCBC/image-dimensions/635x417?v=v2" width="635" height="417" role="button" title="RodrigoCampos_1-1774029113223.png" alt="RodrigoCampos_1-1774029113223.png" /></span></P><P>&nbsp;</P><P class=""><STRONG>Event Payload</STRONG><SPAN>:</SPAN></P><pre class="lia-code-sample language-json"><code>{ "event_id": "evt-load-0001", "event_created_date_time": "2026-03-16T10:15:30Z", "event": { "journey_type": "EQUIPMENT", "event_classifier": "ACT", "event_type": "LOAD", "transport_mode": "VESSEL", "empty_indicator": "FULL" }, "facility": { "facility_type": "POTE", "location": { "location_code": "BRSSZ", "location_name": "Port of Santos" } }, "transport": { "vessel_name": "Atlantic Pearl", "voyage_number": "VY-2024-095" }, "equipment": { "container_number": "MSKU1234567", "iso_equipment_code": "22G1" }, "shipment": { "commodity": "Green Coffee Beans", "gross_weight_kg": 18000 }, "destination": { "location_code": "BEANR", "location_name": "Port of Antwerp" } }</code></pre><P>&nbsp;</P><P><SPAN>On <STRONG>step 1</STRONG>, the event is published on a topic of SAP Event Mesh</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RodrigoCampos_0-1773852885536.png" style="width: 654px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385801i67833972314A9975/image-dimensions/654x541?v=v2" width="654" height="541" role="button" title="RodrigoCampos_0-1773852885536.png" alt="RodrigoCampos_0-1773852885536.png" /></span></P><P><SPAN>On the <STRONG>step 2</STRONG>, the event is consumed by the Event-to-Business Actions framework that triggers the workflow on SAP Build Process Automation.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1772502460588.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385672i56C2E764CC847BFF/image-size/medium?v=v2&amp;px=400" role="button" title="1772502460588.png" alt="1772502460588.png" /></span></SPAN></P><P class="">On the <STRONG>step 3</STRONG>, an integration flow is triggered on Integration Suite:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RodrigoCampos_1-1773853191190.png" style="width: 609px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385803i57A10E9C1DD963E6/image-dimensions/609x479?v=v2" width="609" height="479" role="button" title="RodrigoCampos_1-1773853191190.png" alt="RodrigoCampos_1-1773853191190.png" /></span></P><H3 id="toc-hId-545783811">&nbsp;</H3><H3 id="ember87" id="toc-hId-349270306">Integration Suite</H3><P class="">On <STRONG>step 4</STRONG>, Integration flow fetches the Ocean Freight Booking on <STRONG>SAP Cloud ERP(Step 5)</STRONG>&nbsp;according to the 'Container ID' and 'Voyage ID' and then proceed with the creation of the Electronic Bill of Lading via TradeTrust Framework.</P><P class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="iflow.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385674i79B6A19AD9355292/image-size/large?v=v2&amp;px=999" role="button" title="iflow.png" alt="iflow.png" /></span></P><H3 id="ember90" id="toc-hId-152756801">Business Partners:</H3><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="bp2.png" style="width: 783px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385677iB815D6B6B1266A7F/image-dimensions/783x263?v=v2" width="783" height="263" role="button" title="bp2.png" alt="bp2.png" /></span></P><P><STRONG>Container:</STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="container2.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385680i30F1FB154C2DBBAB/image-size/large?v=v2&amp;px=999" role="button" title="container2.png" alt="container2.png" /></span></STRONG></P><P>&nbsp;</P><P><STRONG>Shipping Instructions</STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773697198946.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385681i1F970CA1C5AE149B/image-size/large?v=v2&amp;px=999" role="button" title="1773697198946.png" alt="1773697198946.png" /></span></STRONG></P><P class="">After SAP Integration Suite fetch the data from the backend, it generate a payload.</P><H3 id="ember97" id="toc-hId--118988073">Electronic Bill of Lading Payload:</H3><pre class="lia-code-sample language-json"><code>{ "$schema": "https://schema.tradetrust.io/ebl/1.0/schema.json", "@context": [ "https://www.w3.org/2018/credentials/v1", "https://schema.trustvc.io/credentials/v1" ], "id": "urn:uuid:sap-ebl-trustvc-001", "type": [ "VerifiableCredential", "ElectronicBillOfLading", "TradeTrustDocument" ], "issuers": [ { "name": "Carrier", "documentStore": "0x0908aD5481673E19c3D03f1379E0032458118881", "identityProof": { "type": "DNS-TXT", "location": "carrier.example.com" } } ], "issuanceDate": "2026-03-16T11:00:00Z", "credentialSubject": { "id": "did:ethr:0x562eeBbaBB405db740f2e607F87f152989a10b7E", "origin": "Port of Santos, Brazil", "destination": "Port of Antwerp, Belgium", "goods": "Green Coffee Beans", "amount": "18 tons", "container": "1 TEU", "holder": "0x562eeBbaBB405db740f2e607F87f152989a10b7E", "consignee": "0x5C1d8d47784d8302B3839436e0e82E094D8e234f" } }</code></pre><P>&nbsp;</P><P><SPAN>On <STRONG>step 6</STRONG>, Integration Suite sends the payload to the TradeTrust framework to issue the eBL(<STRONG>step 7</STRONG>) :</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="RodrigoCampos_2-1773853316058.png" style="width: 648px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385804i4188E20410823156/image-dimensions/648x557?v=v2" width="648" height="557" role="button" title="RodrigoCampos_2-1773853316058.png" alt="RodrigoCampos_2-1773853316058.png" /></span></P><P>&nbsp;</P><P><STRONG>Tradetrust framework Node.js </STRONG><SPAN>deployed on</SPAN> <STRONG>Cloud Foundry.</STRONG></P><pre class="lia-code-sample language-javascript"><code>const fs = require("fs"); const path = require("path"); const { Wallet, ethers } = require("ethers"); const { signDocument, SUPPORTED_SIGNING_ALGORITHM } = require("@tradetrust-tt/tradetrust"); require("dotenv").config(); const RPC_URL = "https://rpc.sepolia.linea.build"; // Linea Sepolia RPC const PRIVATE_KEY = process.env.PRIVATE_KEY; // Carrier wallet const NFT_CONTRACT_ADDRESS = "0x6fD6DB343c5d84Baa7fDaeD5CedDA15652451a8f"; // Stakeholders const EXPORTER = "0x562eeBbaBB405db740f2e607F87f152989a10b7E"; const IMPORTER = "0x5C1d8d47784d8302B3839436e0e82E094D8e234f";</code></pre><P><SPAN>The payload is wrapped with</SPAN> <STRONG>OpenAttestation</STRONG> <SPAN>metadata and cryptographically signed using the carrier’s key pair (public and private keys).</SPAN></P><pre class="lia-code-sample language-javascript"><code>let rawWrapped = fs.readFileSync(WRAPPED_JSON, "utf-8"); const wrappedDocument = JSON.parse(rawWrapped); console.log("✅ Wrapped document loaded"); // Sign document with carrier key const keyPair = { public: "did:ethr:0x9843Cd2834010A4dca776d3035117750d20b3C01#controller", private: PRIVATE_KEY }; const signedDocument = await signDocument( wrappedDocument, SUPPORTED_SIGNING_ALGORITHM.Secp256k1VerificationKey2018, keyPair ); fs.writeFileSync(SIGNED_JSON, JSON.stringify(signedDocument, null, 2)); console.log("Document signed successfully");</code></pre><P><STRONG>Prepare parameters</STRONG></P><pre class="lia-code-sample language-javascript"><code>// Connect wallet &amp; contract const provider = new ethers.JsonRpcProvider(RPC_URL); const wallet = new Wallet(PRIVATE_KEY, provider); console.log("🧾 Wallet (carrier):", wallet.address); const balance = await provider.getBalance(wallet.address); console.log(" ETH balance:", ethers.formatEther(balance)); if (balance === 0n) throw new Error("Wallet has ZERO ETH — fund it for gas"); const contract = new ethers.Contract(NFT_CONTRACT_ADDRESS, EBL_ABI, wallet); // Check wallet is carrier const carrierAddress = await contract.carrier(); if (wallet.address.toLowerCase() !== carrierAddress.toLowerCase()) { throw new Error(`Wallet is not the carrier. Contract carrier is ${carrierAddress}`); } //Prepare issueEBL parameters const tokenId = BigInt(Date.now()); // PoC uniqueness const merkleRoot = signedDocument?.signature?.merkleRoot; const documentHash = toBytes32(merkleRoot); // Estimate gas + send const gasEstimate = await contract.issueEBL.estimateGas( tokenId, EXPORTER, IMPORTER, documentHash, tokenURI ); const gasLimit = percentBuffer(gasEstimate, 25); const maxPriorityFeePerGas = ethers.parseUnits("1", "gwei"); // tip const maxFeePerGas = ethers.parseUnits("5", "gwei"); // must be &gt;= priority const tx = await contract.issueEBL( tokenId, EXPORTER, IMPORTER, documentHash, tokenURI, { gasLimit, maxFeePerGas, maxPriorityFeePerGas } ); console.log("📤 Transaction sent:", tx.hash); const receipt = await tx.wait(); console.log("✅ Mint/Issue confirmed in block:", receipt.blockNumber);</code></pre><P>&nbsp;</P><P><STRONG>NFT Minted on Blockchain</STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773698854001.png" style="width: 735px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385780iB5A63769088B7E83/image-dimensions/735x162?v=v2" width="735" height="162" role="button" title="1773698854001.png" alt="1773698854001.png" /></span></STRONG></P><P><STRONG><EM>From this point onward, all TradeTrust-related steps will be demonstrated using the TradeTrust viewer. However, these operations can also be implemented programmatically using the TradeTrust Node.js library.</EM></STRONG></P><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773698010785.png" style="width: 746px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385785iA84843284EDA3320/image-dimensions/746x376?v=v2" width="746" height="376" role="button" title="1773698010785.png" alt="1773698010785.png" /></span></EM></STRONG></P><H3 id="ember112" id="toc-hId--315501578">Electronic Bill of Lading created:</H3><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773687335919.png" style="width: 744px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385786i23F364391B88A3D7/image-dimensions/744x657?v=v2" width="744" height="657" role="button" title="1773687335919.png" alt="1773687335919.png" /></span></EM></STRONG></P><H3 id="ember114" id="toc-hId--512015083">2. Event: Departure</H3><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773458029764.png" style="width: 541px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385788iE392E8C9AAF9A448/image-dimensions/541x346?v=v2" width="541" height="346" role="button" title="1773458029764.png" alt="1773458029764.png" /></span></EM></STRONG></P><P>Once the vessel leaves the port and start the journey, the Terminal Operating System emits the event Departure:</P><pre class="lia-code-sample language-javascript"><code>{ "event_id": "evt-depa-0001", "event_created_date_time": "2026-03-16T18:40:00Z", "journey_event": { "journey_type": "TRANSPORT", "event_classifier": "ACT", "event_type": "DEPA", "transport_mode": "VESSEL", "facility_type": "POTE" }, "shipment_location": { "type_code": "POL", "location_code": "BRSSZ" }, "transport": { "vessel_name": "Atlantic Pearl", "voyage_number": "VY-2024-095" }, "shipment": { "transport_document_reference": "BL-SANTOS-ANT-0001" } }</code></pre><P>The vessel starts to transmit telemetry(stored on a Hana DB) which is used for tracking and trace:</P><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1772502569575.png" style="width: 607px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385787i2C561778572D6FF2/image-dimensions/607x376?v=v2" width="607" height="376" role="button" title="1772502569575.png" alt="1772502569575.png" /></span></EM></STRONG></P><P>Once the goods are in transit, the buyer is notified via SAP BPA to provide the payment:</P><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1772502568799.png" style="width: 648px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385789iA8874A94E06AD890/image-dimensions/648x243?v=v2" width="648" height="243" role="button" title="1772502568799.png" alt="1772502568799.png" /></span></EM></STRONG></P><P>Once the payment is verified, the ownership of the Electronic Bill of Lading can be transferred to the Importer:</P><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773685657932.png" style="width: 739px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385790i52381E823C1633D2/image-dimensions/739x381?v=v2" width="739" height="381" role="button" title="1773685657932.png" alt="1773685657932.png" /></span></EM></STRONG></P><H3 id="ember123" id="toc-hId--708528588">3. Event: Arrival</H3><HR /><P class="">This event notifies the consignee via SAP Process Automation that the goods have arrived at the destination port and it is ready for pick up</P><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773458097005.png" style="width: 547px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385791iFDD71122BB7CD1C2/image-dimensions/547x368?v=v2" width="547" height="368" role="button" title="1773458097005.png" alt="1773458097005.png" /></span></EM></STRONG></P><P><STRONG><EM>Payload:</EM></STRONG></P><pre class="lia-code-sample language-javascript"><code>{ "event_id": "evt-arri-0001", "event_created_date_time": "2026-03-26T07:20:00Z", "journey_event": { "journey_type": "TRANSPORT", "event_classifier": "ACT", "event_type": "ARRI", "transport_mode": "VESSEL", "facility_type": "POTE" }, "shipment_location": { "type_code": "POD", "location_code": "BEANR" }, "transport": { "vessel_name": "Atlantic Pearl", "voyage_number": "VY-2024-095" }, "shipment": { "transport_document_reference": "BL-SANTOS-ANT-0001" } }</code></pre><P>&nbsp;</P><P>Journey completed:</P><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1772502569779.png" style="width: 641px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385792i86B66A6CE306C89E/image-dimensions/641x397?v=v2" width="641" height="397" role="button" title="1772502569779.png" alt="1772502569779.png" /></span></EM></STRONG></P><P>&nbsp;</P><P>The Importer surrenders the electronic Bill of Lading to the carrier for cargo release at the destination port.</P><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773686293894.png" style="width: 739px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385793i56AE113B10F2FF40/image-dimensions/739x450?v=v2" width="739" height="450" role="button" title="1773686293894.png" alt="1773686293894.png" /></span></EM></STRONG></P><P>The surrender step marks the end of the workflow and completes the trade process.</P><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1772502568800.png" style="width: 422px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385794iD849C24C85960D1D/image-dimensions/422x161?v=v2" width="422" height="161" role="button" title="1772502568800.png" alt="1772502568800.png" /></span></EM></STRONG></P><P>Endorsement Chain completed:</P><P><STRONG><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1773683927552.png" style="width: 702px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/385795i73C4AB1769876EEF/image-dimensions/702x410?v=v2" width="702" height="410" role="button" title="1773683927552.png" alt="1773683927552.png" /></span></EM></STRONG></P><H2 id="ember135" id="toc-hId--611639086">Conclusion:</H2><P class="">This Proof of Concept demonstrates how an electronic Bill of Lading can be issued, verified, and transferred using a blockchain technology integrated with SAP Business Technology Platform.</P><P class="">Given that modern container vessels can carry thousands of containers, the proposed architecture is designed to scale and process a high volume of operational events efficiently.</P><P class="">Looking ahead, <STRONG>AI agents</STRONG> could be integrated to further enhance the solution. These agents could monitor events, detect potential issues, automate operational tasks, and trigger workflows when required.</P><P class="">Combined with digital payment mechanisms such as on-chain settlement, this approach has the potential to significantly transform how international trade processes are executed.</P><P class="">&nbsp;</P><P class="" data-unlink="true"><STRONG>Sources: </STRONG>SAP BTP Guidance Framework,&nbsp; SAP Application Extension Methodology&nbsp;, SAP Integration Solution Advisory Methodology&nbsp;, Integration Architecture Guide.</P><P><STRONG>References:</STRONG></P><P>[1] ICC Academy: Break the eBL silos: Why interoperability is the missing link in digital trade</P><P>[2] CargoX: Environmental impact of digitalisation in shipping documentation: Carbon footprint comparison of paper and electronic bills of lading</P><P>[3] Weareprocarrier</P><P>[4] Intracen: International Trade Centre</P><P>[5] IMDA: TradeTrust Legal Analysis Article</P><P>[6] Smart Ports Bynder</P><P>[7] GitHub - Event to Business Action</P><P>[8] Irishweekly: Europe Greenlights Massive Mercosur Trade Deal, Ending Long Stalemate</P><P>[9] 93degreescoffeeroasters</P><P>[10] ICC Academy: Ebl digital trade</P><P>[11] Intracen: Expediting Trade Through Electronic Bills of Lading</P><P class="">&nbsp;</P> 2026-04-02T19:09:58.380000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/message-mapping-in-sap-integration-suite-custom-scripts-and-conditional/ba-p/14362602 Message Mapping in SAP Integration Suite - Custom Scripts and Conditional Mapping 2026-04-03T18:10:00.019000+02:00 jirifridrich https://community.sap.com/t5/user/viewprofilepage/user-id/146600 <P>I find it useful to look at two capabilities of message mapping, which may seem confusing and may be overlooked for the first-sight complexity - <STRONG>custom functions and graphical conditional mapping</STRONG> - both being configured in the bottom half of the message mapping screen.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_0-1775158859046.png" style="width: 846px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392792iBFD839403FD0B422/image-dimensions/846x422?v=v2" width="846" height="422" role="button" title="jirifridrich_0-1775158859046.png" alt="jirifridrich_0-1775158859046.png" /></span></P><H2 id="toc-hId-1793220076">Custom Groovy Functions</H2><P>The standard function library in the Mapping Expression editor already covers a lot of use-cases. Under Standard you get arithmetic, boolean logic, date functions, string operations, conversions, and node functions. For many projects, this is sufficient.</P><P>Where the standard library starts to show its limits is when your logic involves multiple conditions chained together, or when you need to validate and reformat values in a way the graphical nodes simply cannot express cleanly.</P><H2 id="toc-hId-1596706571">Writing a Custom Script Function</H2><P>You can extend the mapping with your own Groovy functions. The function is added directly in the Mapping Expression editor under Scripts.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_3-1774812798256.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/390483i61FCE92AF3140374/image-size/medium?v=v2&amp;px=400" role="button" title="jirifridrich_3-1774812798256.png" alt="jirifridrich_3-1774812798256.png" /></span></P><P>I chose a simple example of a custom function - the script will transform a date from YYYY-MM-DD format into SAP-native date format YYYYMMDD. This is a trivial functionality and is actually coved by the standard functions (section 'Date'), but the point here is just to show the syntax.<BR />Click 'Create', give the script a name and you will be taken to a Groovy editor.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_4-1774813109998.png" style="width: 215px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/390484iED09A971932F70C5/image-dimensions/215x93?v=v2" width="215" height="93" role="button" title="jirifridrich_4-1774813109998.png" alt="jirifridrich_4-1774813109998.png" /></span></P><P>Delete the placeholder code and the script will then look like this:</P><pre class="lia-code-sample language-abap"><code>import com.sap.it.api.mapping.* def String date_to_YYYYMMDD(String date) { if (date == null || date.trim().isEmpty()) { return "" } // Expected input format: YYYY-MM-DD if (!date.matches("\\d{4}-\\d{2}-\\d{2}")) { return "" } // Remove hyphens return date.replaceAll("-", "") }</code></pre><P><EM>Import com.sap.it.api.mapping.*</EM> is the API package you need for mapping scripts.<BR />Null and empty guard - the very first thing the function does is handle null and blank input.<BR />Input validation before processing - the regex check ensures the function only processes values that actually look like a date. If the source field contains garbage, the function returns empty rather than silently producing a malformed output.<BR />The transform itself - o<SPAN>nce the value passes validation, removing the hyphens is a one-liner.&nbsp;</SPAN></P><P><SPAN>You can even have multiple input parameters or work with nodes, but we keep it simple in this article. You will get the code from any AI tool anyway, so no reason to get too technical. The important thing here to know what is the place for custom logic.</SPAN></P><P><STRONG>Note:</STRONG> Keep your script functions focused — one function, one responsibility. It makes testing much easier and keeps the mapping readable for the next person who opens it.</P><H2 id="toc-hId-1400193066"><STRONG>Graphical Conditional Mapping</STRONG></H2><P>Custom scripts are powerful, but for conditional logic that depends on comparing a source field against a known value, the graphical approach is often cleaner and more transparent.&nbsp;<BR />We look at a dummy scenario, where the business rule is simple: if PO_NUMBER equals 100500, the recipient should be 100500; for anything else, the default recipient is 100000.</P><H3 id="toc-hId-1332762280"><STRONG>Building the Condition</STRONG></H3><P>In the Mapping Expression canvas this is what the setup looks like:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_0-1774812399962.jpeg" style="width: 606px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/390480iA7C01FD9F5285E11/image-dimensions/606x158?v=v2" width="606" height="158" role="button" title="jirifridrich_0-1774812399962.jpeg" alt="jirifridrich_0-1774812399962.jpeg" /></span></P><P>Those blue boxes are standard functions from the left menu, the yellow boxes are fields from mapping - PO_NUMBER is a source field, RECIPNT_NO is a target field, values '100500' and '100000' are constants, which we have to summon from the left-hand-side function menu as well.</P><P>The first function is 'equals(string)', which compares two inputs. If the two input values are equal, the result is a boolean 'true'.</P><P>The second function is 'if', which receives a boolean condition - if true, returns the 'true value', if false, returns the 'false value'.</P><P>Reading the canvas left to right: a constant node with value 100500 and the source field PO_NUMBER both feed into an equals(string1, string2) comparison node. The result of that comparison, together with the constant 100000, feed into an if node — where the comparison result is wired to condition, 100500 goes to true value, and 100000 goes to false value. The output of the if node maps directly to RECIPNT_NO.</P><P>No code required. The logic is immediately readable to anyone who opens the mapping editor.</P><H2 id="toc-hId-1007166056"><STRONG>Testing with the Simulate Tool</STRONG></H2><P>Once the mapping is defined you want to verify it before deploying. This is where the Simulate feature saves a lot of time. Instead of deploying the iFlow and sending a real message through it, you can test right inside the Mapping editor.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_1-1775159010754.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392793iC22BF9693AB0BCD6/image-size/medium?v=v2&amp;px=400" role="button" title="jirifridrich_1-1775159010754.png" alt="jirifridrich_1-1775159010754.png" /></span></P><P><STRONG>Generating a Test Payload</STRONG></P><P>Click the Generate button to automatically create a dummy input payload based on your source structure.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_1-1774812399966.jpeg" style="width: 756px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/390482i3956C2D83EAAA958/image-dimensions/756x291?v=v2" width="756" height="291" role="button" title="jirifridrich_1-1774812399966.jpeg" alt="jirifridrich_1-1774812399966.jpeg" /></span></P><P>Every field gets a _sample suffix value so you can immediately identify which source field produced which output. The PO_NUMBER field has been manually changed to 100111 — a value that does not match the constant 100500. The Test Output on the right shows RECIPNT_NO resolved to 100000, confirming the false branch of the condition fired correctly (highlighted by the blue arrow).</P><P>The generated payload is fully editable. This is the key point: Generate gives you the structure, and then you adjust individual field values to test specific scenarios without having to author an entire XML document by hand.</P><P><STRONG>Testing the True Branch</STRONG></P><P>Now change PO_NUMBER to 100500 and run the simulation again:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jirifridrich_2-1774812399969.jpeg" style="width: 821px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/390481i814609A94EF0247A/image-dimensions/821x314?v=v2" width="821" height="314" role="button" title="jirifridrich_2-1774812399969.jpeg" alt="jirifridrich_2-1774812399969.jpeg" /></span></P><P>With PO_NUMBER set to 100500, the Test Output immediately shows RECIPNT_NO as 100500. The blue arrow highlights exactly where to confirm the result in the output tree. The condition evaluated true, and the mapping used the matching constant value.</P><H2 id="toc-hId-810652551"><STRONG>Tips for Using the Simulate Tool Effectively</STRONG></H2><UL><LI>Always test both branches of every condition. It is easy to only verify the happy path — set up values that exercise the false branch too.</LI><LI>Test null and empty inputs. Leave a field blank in the test payload and check that your mapping handles it gracefully, especially for fields that feed into script functions.</LI></UL><H1 id="toc-hId-485056327"><STRONG>Summary</STRONG></H1><P>Message Mapping in SAP Integration Suite is more capable than it might appear at first glance. The graphical function library handles conditional logic elegantly without a single line of code. Custom Groovy scripts let you express validation, reformatting and derivation logic that the standard nodes cannot cover. And the Simulate tool with its Generate feature gives you a tight test cycle right inside the editor.</P><P>To sum up the best-practice: start graphically, reach for a script only when the graphical approach becomes unreadable, and always validate with Simulate before you deploy.</P> 2026-04-03T18:10:00.019000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/currency-conversion-made-easy-with-sap-integration-suite/ba-p/14355736 Currency Conversion Made Easy with SAP Integration Suite 2026-04-03T19:58:00.295000+02:00 jareenabee_dudekula https://community.sap.com/t5/user/viewprofilepage/user-id/2278627 <H1 id="toc-hId-1663304267"><STRONG><span class="lia-unicode-emoji" title=":memo:">📝</span>Introduction</STRONG></H1><P>Hello All,</P><P>As we all know that business environment means working with different countries and their currencies but the thing is we need accurate exchange amounts every day. For this I have prepared an Iflow which will convert the Source Currency into Target Currency most accurately calling an external API. I also used HTML to beautify the output.</P><P><SPAN>The below figure shows the Iflow that I have created for the Currency Conversion in SAP Integration Suite:</SPAN></P><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jareenabee_dudekula_0-1774260050158.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/387589iD3990AE4FA60576A/image-size/large?v=v2&amp;px=999" role="button" title="jareenabee_dudekula_0-1774260050158.jpg" alt="jareenabee_dudekula_0-1774260050158.jpg" /></span><DIV><UL><LI>&nbsp;Here we are sending JSON as input from Postman through HTTPS adapter.</LI><LI>Using a GroovyScript to validate the input JSON, if JSON is in correct format the Json will go through the main flow otherwise it will trigger the EXception Subprocess.</LI></UL><OL><LI>&nbsp;Valid JSON Input:</LI></OL><UL><LI>When JSON is in correct format the JSON will be converted into XML using JSON2XML_In</LI><LI>CM_Extract_Params(content modifier) is used to extract the parameters like source currency, target currency and the amount from the XML into the exchange properties.</LI><LI>Request Reply(RR_Call_API) is used for synchronous communication which will call the exchange rate API&nbsp; which is an external API service&nbsp;through the HTTP adapter connection.</LI><LI>&nbsp;Will receive JSON as output from external API as response which will be converted into XML payload using JSON2XML_API.</LI><LI>This converted XML is used for XSLT mapping(XSLT_HTML) also HTML is used to beautify the output in a tabular format which the target recipient will receive as a mail through mail adapter.</LI></UL><P>&nbsp; &nbsp; &nbsp; &nbsp;2. Invalid JSON input:</P><UL><LI>If the input JSON format is failed then the GS_ValidateInput will trigger the Exception Subprocess which will start with Error Start Event.</LI><LI>Content modifier with the name CM_Error is used to format the body of the error mail using runtime variables including the Error Category, Flow Name, MPL ID and Error timestamp.</LI><LI>Mail adapter in the Exception subprocess will sends the ErrorMail to the support or monitoring team</LI></UL><H2 id="toc-hId-1595873481"><STRONG>Working Demo – Input and Output</STRONG></H2><H3 id="toc-hId-1528442695"><span class="lia-unicode-emoji" title=":heavy_check_mark:">✔️</span><STRONG>Successful Case</STRONG></H3><P>A valid JSON triggers the flow and returns an email with HTML content showing:</P><UL><LI>Source Currency</LI><LI>Target Currency</LI><LI>Source Amount</LI><LI>Converted Amount</LI></UL><P>Input from postman for successful Case:</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jareenabee_dudekula_1-1774260194594.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/387590i7F452C7A0EC0D71B/image-size/large?v=v2&amp;px=999" role="button" title="jareenabee_dudekula_1-1774260194594.jpg" alt="jareenabee_dudekula_1-1774260194594.jpg" /></span><P>Output/successful currency conversion mail:</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-23 at 3.36.54 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/387594i3AFF26179B3D5411/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-23 at 3.36.54 PM.png" alt="Screenshot 2026-03-23 at 3.36.54 PM.png" /></span></DIV><DIV><DIV><H3 id="toc-hId-1331929190"><span class="lia-unicode-emoji" title=":cross_mark:">❌</span><STRONG>Error Case</STRONG></H3><P>Invalid inputs trigger the <STRONG>Exception Subprocess</STRONG>, such as:</P><UL><LI>Missing fields</LI><LI>Incorrect JSON structure</LI><LI>External API failure</LI></UL><P>In such cases, an email is sent containing a clear explanation of the error.</P><P>The below image shows the input from postman for the error case where I just removed a comma in the line 3 at target currency which means an invalid JSON input:</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jareenabee_dudekula_3-1774260542026.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/387596iB8D01CE7F1DE844F/image-size/large?v=v2&amp;px=999" role="button" title="jareenabee_dudekula_3-1774260542026.jpg" alt="jareenabee_dudekula_3-1774260542026.jpg" /></span><P>Output/Error mail for Invalid Input:</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-23 at 3.42.02 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/387598i71AB2F01BCBEF576/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-23 at 3.42.02 PM.png" alt="Screenshot 2026-03-23 at 3.42.02 PM.png" /></span></DIV><DIV><H2 id="toc-hId-1006332966"><STRONG>Exception Subprocess Explained:</STRONG></H2><P>This part of the flow ensures the system remains stable by handling:</P><UL><LI>Bad input format</LI><LI>Missing mandatory fields</LI><LI>External API issues</LI></UL><P>It prevents the main flow from failing silently and provides meaningful alerting via email.</P><DIV><H2 id="toc-hId-809819461">Business<STRONG> Value:</STRONG></H2><UL class="lia-list-style-type-disc"><LI>This solution delivers business value by delivering business value by automating currency conversion with real time exchange rates.</LI><LI>Reduces manual efforts and errors, improves accuracy.</LI><LI>Improves supportability by sending proactive error mails with message details like the MPL ID, Iflow name and error details.</LI></UL><DIV><H2 id="toc-hId-613305956"><STRONG><span class="lia-unicode-emoji" title=":folded_hands:">🙏</span>Conclusion:</STRONG></H2><P>In conclusion this scenario demonstrates how SAP IS can be used for a practical use case involving real time currency conversion.<BR />It’s an excellent example of modernizing business processes using API-driven automation.</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/2278627">@jareenabee_dudekula</a>&nbsp;</P></DIV><P>&nbsp;</P></DIV></DIV></DIV></DIV> 2026-04-03T19:58:00.295000+02:00 https://community.sap.com/t5/technology-blog-posts-by-sap/secure-apis-external-oidc-based-authentication-for-api-artifacts-in-sap/ba-p/14365145 Secure APIs: External OIDC-Based Authentication for API Artifacts in SAP Integration Suite 2026-04-05T02:59:56.314000+02:00 ashutosh_kumar_singh02 https://community.sap.com/t5/user/viewprofilepage/user-id/453525 <P><FONT size="5"><STRONG>Introduction</STRONG></FONT></P><P>Security is the cornerstone of any API strategy. In SAP Integration Suite's Edge Integration Cell (EIC), the <STRONG>Authentication Policy</STRONG> is the first line of defence for every API artifact — and it is non-deletable by design. This is intentional: no API should ever be reachable without an authentication gate.</P><P>Until recently, this policy supported only <STRONG>SAP tenant specific XSUAA-based authentication</STRONG> — a robust mechanism tightly coupled to the SAP Business Technology Platform (BTP) identity ecosystem. While this works perfectly for SAP-native landscapes, modern enterprises increasingly rely on <STRONG>external Identity Providers (IDPs)</STRONG> — whether it's SAP Identity Authentication Service (SAP IAS, Entra, or any OIDC-compliant provider — to manage identities across their application portfolio.</P><P>That's where the new <STRONG>External Auth (OIDC) authentication</STRONG> capability comes in.</P><P>In this blog, I'll walk you through:</P><UL><LI>What the Authentication Policy is and why it is fundamental to EIC</LI><LI>The difference between <STRONG>&nbsp;SAP Tenant specific XSUAA</STRONG> and <STRONG>External (OIDC)</STRONG> authentication — when to use which</LI><LI>A real-world walkthrough using a SuccessFactors (SFSF) API secured with SAP IAS and JWT Bearer grant type</LI></UL><P>Whether you are an integration consultant, an API developer, or a decision-maker evaluating EIC's security posture, this blog is for you.</P><P><FONT size="5"><STRONG>Background: The Authentication Policy in EIC API Artifacts</STRONG></FONT></P><P>When you create an API artifact in SAP Integration Suite and target it to an <STRONG>Edge Integration Cell runtime</STRONG>, an Authentication Policy is automatically attached to the API. This policy sits at the ingress — meaning it validates every inbound request <EM>before</EM> any other policy, mediation or routing logic executes.</P><P>Key characteristics of this policy:</P><UL><LI>It is <STRONG>default and non-deletable</STRONG> — enforcing the principle that no API artifact can run unauthenticated</LI><LI>It governs <STRONG>who</STRONG> is allowed to call your API</LI></UL><P>Prior to the External Auth feature, the only supported mode was <STRONG>Tenant specific Authentication</STRONG> using <STRONG>SAP XSUAA </STRONG>tokens issued from BTP. Now, with the introduction of <STRONG>External Authentication</STRONG>, you can configure the policy to validate tokens issued by any OIDC-compliant external IDP.</P><P><FONT size="5"><STRONG>Tenant specific XSUAA</STRONG> <STRONG>vs. External Authentication: What's the Difference?</STRONG></FONT></P><P><FONT size="4"><STRONG>SAP Tenant specific XSUAA</STRONG> <STRONG>Authentication </STRONG></FONT></P><P>The calling application obtains an OAuth 2.0 access token from SAP XSUAA — the authorization server embedded in SAP BTP. This token is then passed in the Authorization header when invoking the API artifact URL on EIC. EIC runtime validates the token against the BTP subaccount's XSUAA instance. The token's audience, client credentials, and scopes are checked internally within the SAP trust chain.</P><P><STRONG>When to use it:</STRONG></P><UL><LI>The calling application is built on SAP BTP (e.g., a BTP-hosted app, a CAP service, or another Integration Suite artifact)</LI><LI>Your identity landscape is fully SAP-native</LI><LI>You want zero configuration overhead — XSUAA trust is pre-established within the SAP ecosystem</LI><LI>Internal system-to-system calls where all principals live in BTP</LI></UL><P>&nbsp;Minimal configuration, since EIC and BTP share the same trust domain, you primarily use either type (“oAuth”, “Basic”, “Client Certificate” ) and token is generated/validated with XSUAA</P><P><FONT size="4"><STRONG>External Authentication (OIDC-based External IDP)</STRONG></FONT></P><P>The calling application obtains a JWT token from an external OIDC-compliant Identity Provider (e.g., SAP IAS, Entra, Okta etc.). This JWT is passed to runtime, which validates it against the external IDP's OIDC configuration. EIC runtime uses the IDP's <STRONG>Well-Known URL</STRONG> (the OIDC discovery endpoint) to fetch the public keys and token metadata, then validates:</P><UL><LI><STRONG>Token signature</STRONG> — verified against the IDP's JWKS (JSON Web Key Set)</LI><LI><STRONG>Audience (</STRONG><STRONG>aud claim)</STRONG> — must match what is configured in the policy</LI><LI><STRONG>Client ID</STRONG> — validated against the registered application</LI><LI><STRONG>Expiry and standard JWT claims</STRONG></LI></UL><P>If all validations pass, the token is considered authentic and the request proceeds. The validated token can then be propagated downstream to the backend API (e.g., SuccessFactors) — enabling end-to-end token chaining.</P><P><STRONG>When to use it:</STRONG></P><UL><LI>Your calling application uses a <STRONG>non-SAP IDP</STRONG> or SAP IAS as its identity authority</LI><LI>You are integrating with <STRONG>third-party ecosystems</STRONG> (partner apps, customer portals, mobile apps) that are not BTP-resident</LI><LI>You need to support <STRONG>federated identity scenarios</STRONG> — e.g., corporate Azure AD federated into SAP IAS</LI><LI>Your organization's identity strategy mandates a <STRONG>centralized external IDP</STRONG> beyond BTP's XSUAA</LI><LI>You are calling APIs on behalf of a <STRONG>human user</STRONG> whose identity lives in IAS (not in XSUAA)</LI></UL><TABLE><TBODY><TR><TD width="214"><P><STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Aspect</STRONG></P></TD><TD width="214"><P><STRONG>Internal (XSUAA)</STRONG></P></TD><TD width="214"><P><STRONG>External (OIDC)</STRONG></P></TD></TR><TR><TD width="214"><P><STRONG>Token Issuer</STRONG></P></TD><TD width="214"><P>SAP BTP XSUAA</P></TD><TD width="214"><P>Any OIDC-compliant IDP (IAS, Entra, Okta…)</P></TD></TR><TR><TD width="214"><P><STRONG>Trust Setup</STRONG></P></TD><TD width="214"><P>Pre-established within BTP</P></TD><TD width="214"><P>Configured via Well-Known URL in policy</P></TD></TR><TR><TD width="214"><P><STRONG>Primary Use Case</STRONG></P></TD><TD width="214"><P>BTP-native app-to-API calls</P></TD><TD width="214"><P>Cross-ecosystem, federated, or IAS-managed identities</P></TD></TR><TR><TD width="214"><P><STRONG>Token Type</STRONG></P></TD><TD width="214"><P>XSUAA OAuth 2.0 Access Token</P></TD><TD width="214"><P>Standard OIDC JWT</P></TD></TR><TR><TD width="214"><P><STRONG>Policy Config Effort</STRONG></P></TD><TD width="214"><P>Minimal</P></TD><TD width="214"><P>Explicit (Well-Known URL, Audience, Client ID)</P></TD></TR><TR><TD width="214"><P><STRONG>Token Propagation</STRONG></P></TD><TD width="214"><P>Supported</P></TD><TD width="214"><P>Supported</P></TD></TR><TR><TD width="214"><P><STRONG>User Info Key (Audit)</STRONG></P></TD><TD width="214"><P>Not applicable</P></TD><TD width="214"><P>Optional — JWT claim for audit identity; falls back to Client ID</P></TD></TR></TBODY></TABLE><P><STRONG><FONT size="5">Create an API in SAP Integration Suite with External Auth</FONT></STRONG></P><P>Now let's bring this to life with a concrete scenario.</P><P><FONT size="4"><STRONG>Scenario Overview</STRONG></FONT></P><P>I have a Application Status API &nbsp;of SuccessFactors(SFSF) managed via an API artifact on EIC runtime. The API is consumed by an application developer (or an application they have built) whose identity is managed by SAP Identity Authentication Service (IAS). The SFSF API itself is configured to accept OAuth 2.0 JWT Bearer tokens issued by IAS.</P><P>The flow looks like this:</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Application Developer</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; │&nbsp; 1. Obtains JWT from SAP IAS token endpoint</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ▼</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SAP IAS (External IDP)</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;│&nbsp; 2. JWT passed in Authorization header</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;▼</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; API Artifact URL on EIC</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; │&nbsp; 3. Authentication Policy validates JWT</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; │&nbsp;&nbsp;&nbsp;&nbsp; - Well-Known URL → fetch JWKS from IAS</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; │&nbsp;&nbsp;&nbsp;&nbsp; - Validate: signature, audience, client ID</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; │&nbsp;&nbsp;&nbsp;&nbsp; - Resolve caller identity</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ▼</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Validation Passed</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;│&nbsp; 4. Token propagated to SFSF API</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;▼</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Backend API</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; │&nbsp; 5. Backend&nbsp; validates JWT Bearer, returns response</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ▼</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Response returned to caller</P><P><STRONG>Prerequisites</STRONG></P><P>Before we start the let’s ensure the following are in place:</P><UL><LI><STRONG>SAP Integration Suite</STRONG> is activated with both <STRONG>API Management</STRONG> and <STRONG>Cloud Integration</STRONG> capabilities enabled in your BTP subaccount</LI><LI><STRONG>Edge Integration Cell</STRONG> is provisioned.</LI><LI>An API artifact has been created in your Integration Suite tenant targeting the EIC runtime, with the SFSF API as the backend target URL</LI><LI>In SAP IAS, an application is registered representing your API client. Note down:</LI><UL><LI>The IAS tenant's Well-Known URL: https://&lt;your-ias-tenant&gt;.accounts.ondemand.com/.well-known/openid-configuration</LI><LI>The Client ID of the registered IAS application</LI><LI>The Audience configured for token issuance (often the client ID itself, or a dedicated resource URI)</LI></UL><LI>The SFSF OAuth configuration is set up to trust IAS-issued JWT Bearer tokens</LI></UL><P><STRONG>&nbsp;Model the Authentication Policy in the API Artifact</STRONG></P><OL><LI>Navigate to <STRONG>Design → Integrations and APIs</STRONG> in your SAP Integration Suite tenant</LI><LI>Open the <STRONG>Content Package</STRONG> containing your SFSF API artifact</LI><LI>Click on the <STRONG>API artifact</STRONG> to open it in the editor</LI><LI>Switch to the <STRONG>Policies</STRONG> tab</LI><LI>You will see the <STRONG>Authentication Policy</STRONG> already present — this is the default, non-deletable policy attached to every API artifact on EIC</LI><LI>Click on the <STRONG>Authentication Policy</STRONG> to open its configuration panel</LI></OL><P>&nbsp; &nbsp; &nbsp; &nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ashutosh_kumar_singh02_0-1775203146218.png" style="width: 709px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392905i70AA503235EECF0D/image-dimensions/709x402?v=v2" width="709" height="402" role="button" title="ashutosh_kumar_singh02_0-1775203146218.png" alt="ashutosh_kumar_singh02_0-1775203146218.png" /></span></P><P><STRONG>Configure External Authentication</STRONG></P><P>In the Authentication Policy configuration panel: Under <STRONG>Authentication Policy</STRONG>, check External OAuth (OIDC).<BR /><BR />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ashutosh_kumar_singh02_1-1775203146223.png" style="width: 663px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392903iD13BCE19F1421DE1/image-dimensions/663x325?v=v2" width="663" height="325" role="button" title="ashutosh_kumar_singh02_1-1775203146223.png" alt="ashutosh_kumar_singh02_1-1775203146223.png" /></span></P><P>&nbsp; &nbsp; In the <STRONG>Well-Known URL</STRONG> field, enter your SAP IAS discovery endpoint:</P><P class="lia-align-left" style="text-align : left;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;https://&lt;your-ias-tenant&gt;.accounts.ondemand.com/.well-known/openid-configuration</P><P class="lia-align-left" style="text-align : left;">&nbsp;This URL tells runtime where to fetch the IDP's public signing keys and token metadata. EIC calls this endpoint at runtime to&nbsp; &nbsp; &nbsp; &nbsp; validate incoming JWTs. In the <STRONG>Audience</STRONG> field, enter the audience value that IAS is configured to embed in the JWT's aud claim.&nbsp; &nbsp; This is typically the Client ID of the target application or a resource URI defined in IAS.</P><P>In the <STRONG>Client ID</STRONG> field, enter a dynamic expression which maps to the claim in your JWT token representing the <STRONG>Client ID</STRONG> of the IAS application that the calling application uses to obtain its JWT. For e.g. ${authn.oidc.jwt.azp}</P><P>In the <STRONG>User Info Key</STRONG> field <EM>(optional)</EM>, enter a dynamic expression which maps JWT claim you want EIC to use for identifying the caller in audit logs — for example, email, sub, or user_name. For e.g. ${authn.oidc.jwt.email}.</P><P class="lia-align-left" style="text-align : left;">There is a preference for UserInfo Key:</P><OL class="lia-align-left" style="text-align : left;"><LI>If you provide a value (e.g., email), the runtime will look for that claim in the inbound JWT or in the IDP's UserInfo endpoint response, and use it as the caller identity in audit log entries.</LI><LI>If you leave it <STRONG>empty</STRONG>, the runtime falls back to the <STRONG>Client ID</STRONG> as the audit identity.</LI><LI>If you provide a value but the claim is <STRONG>not found</STRONG> in the JWT or UserInfo at runtime, the EIC again falls back to the Client ID — <STRONG>the policy does not fail</STRONG>. At most, audit log entries will reflect the fallback identifier rather than the preferred one.</LI></OL><P class="lia-align-left" style="text-align : left;">&nbsp;If your organisation's audit and compliance requirements demand that API access logs reflect human-readable identifiers (like an email address or user principal name) rather than technical Client IDs, this is the field to configure. It gives you meaningful, traceable audit trails without any impact on the authentication flow itself.</P><P class="lia-align-left" style="text-align : left;">&nbsp;</P><DIV class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ashutosh_kumar_singh02_2-1775203146227.png" style="width: 703px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392904i882DF872E5D86EE0/image-dimensions/703x351?v=v2" width="703" height="351" role="button" title="ashutosh_kumar_singh02_2-1775203146227.png" alt="ashutosh_kumar_singh02_2-1775203146227.png" /></span></DIV><P><STRONG>Save and Deploy the API Artifact to EIC Runtime Profile</STRONG></P><OL><LI>In the artifact editor, click Deploy</LI><LI>Select your Edge Integration Cell runtime as the deployment target</LI><LI>Confirm the deployment<BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ashutosh_kumar_singh02_3-1775203146236.png" style="width: 733px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392907iA4D9D91BE0CAF1CF/image-dimensions/733x401?v=v2" width="733" height="401" role="button" title="ashutosh_kumar_singh02_3-1775203146236.png" alt="ashutosh_kumar_singh02_3-1775203146236.png" /></span><BR /><BR />Navigate to <STRONG>Monitor → Integrations and APIs</STRONG> and switch the runtime filter to your EIC instance to verify the artifact status shows <STRONG>"Started"</STRONG></LI></OL><DIV class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ashutosh_kumar_singh02_4-1775203146242.png" style="width: 700px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392906iB4673C7DB1C1D8DD/image-dimensions/700x397?v=v2" width="700" height="397" role="button" title="ashutosh_kumar_singh02_4-1775203146242.png" alt="ashutosh_kumar_singh02_4-1775203146242.png" /></span></DIV><P><STRONG>&nbsp;</STRONG><STRONG>Invoke the API — End-to-End Flow in Action</STRONG></P><P>Now let's test the flow from the application developer's perspective.</P><P><STRONG>Obtain a JWT from SAP IAS:</STRONG></P><P>The application developer (or application) calls the IAS token endpoint using the <STRONG>JWT Bearer grant type</STRONG>. In this grant type, the application presents a signed JWT assertion to IAS, which in turn issues a new JWT scoped for the target audience (SFSF). IAS validates the assertion and returns an access token (JWT).</P><P><STRONG>&nbsp; &nbsp; &nbsp; &nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ashutosh_kumar_singh02_5-1775203146251.png" style="width: 702px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392908iCC1C6294B9DBDF5F/image-dimensions/702x542?v=v2" width="702" height="542" role="button" title="ashutosh_kumar_singh02_5-1775203146251.png" alt="ashutosh_kumar_singh02_5-1775203146251.png" /></span></STRONG></P><P><STRONG>Call the API artifact URL on EIC:</STRONG></P><P>&nbsp;</P><DIV class="">&nbsp; &nbsp; &nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ashutosh_kumar_singh02_6-1775203146258.png" style="width: 700px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392909i9C3F7CCC35B08804/image-dimensions/700x516?v=v2" width="700" height="516" role="button" title="ashutosh_kumar_singh02_6-1775203146258.png" alt="ashutosh_kumar_singh02_6-1775203146258.png" /></span></DIV><P><STRONG>What happens inside EIC runtime profile:</STRONG></P><OL><LI>The request hits the EIC ingress</LI><LI>The <STRONG>Authentication Policy</STRONG> intercepts it</LI><LI>EIC fetches the JWKS from the IAS Well-Known URL (cached after first call for performance)</LI><LI>The JWT signature is verified using IAS's public key</LI><LI>The aud claim is matched against the configured Audience</LI><LI>The client_id (or azp claim) is matched against the configured Client ID</LI><LI>The EIC runtime resolves the <STRONG>caller identity</STRONG>— using the configured User Info Key claim (e.g., email) from the JWT or IAS UserInfo endpoint; falls back to Client ID if the claim is absent</LI><LI>Validation passes ✓</LI><LI>The JWT is <STRONG>propagated as-is</STRONG> in the Authorization header to the SFSF API backend</LI><LI>SFSF validates the JWT Bearer token against its own IAS trust configuration and returns the employee data</LI></OL><P><STRONG>Response flows back</STRONG> through EIC to the original caller.</P><P><STRONG>Step 6: What Happens on Validation Failure?</STRONG></P><P>If the JWT is invalid — expired, wrong audience, or tampered signature — EIC returns:</P><P>HTTP 401 Unauthorized</P><P>{</P><P>&nbsp;&nbsp;&nbsp; "error": {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "code": "invalidToken",</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "message": "Unable to authenticate user, invalid token"</P><P>&nbsp;&nbsp;&nbsp; }</P><P>}</P><P>The request never reaches the backend. This is the security guarantee of the non-deletable Authentication Policy — the backend is always protected.</P><P><STRONG>Key Takeaways</STRONG></P><OL><LI><STRONG>The Authentication Policy is the immovable security anchor</STRONG> of every EIC API artifact — and that is a feature, not a limitation.</LI><LI><STRONG>Tenant specific (XSUAA) authentication</STRONG> is your go-to for BTP-native, SAP-ecosystem calls. Zero configuration friction, pre-established trust.</LI><LI><STRONG>External (OIDC) authentication</STRONG> unlocks enterprise-wide API security — enabling any OIDC-compliant IDP to serve as the trust authority, with EIC validating tokens using standard OIDC discovery.</LI><LI><STRONG>Configuration is declarative and straightforward</STRONG> — four fields (Well-Known URL, Audience, Client ID, and the optional User Info Key) are all you need to onboard an external IDP into your API security model. The User Info Key is a lightweight but powerful addition — it shapes how callers appear in your audit logs without touching the authentication flow.</LI><LI><STRONG>Token propagation works seamlessly</STRONG> — validated external JWT tokens are forwarded to backend systems like SuccessFactors, enabling clean end-to-end identity chaining without re-authentication.</LI><LI><STRONG>The SFSF + SAP IAS scenario</STRONG> demonstrates a production-grade pattern: IAS as the central identity broker, JWT Bearer as the grant type, and EIC as the secure, policy-governed API gateway — all within your private, on-premise or hybrid landscape.</LI></OL><P><STRONG>What's Next?</STRONG></P><P>The introduction of External IDP authentication in EIC is a significant step toward making EIC a truly enterprise-grade, identity-agnostic API gateway — one that can sit in your private landscape while speaking the universal language of OIDC.</P><P>In upcoming post, I'll explore:</P><UL><LI>Configuration and Authentication via Microsoft <STRONG>Entra ID → Integration Cell (New generation cloud based runtime for API Management)</STRONG> for enterprise SSO-driven API access</LI></UL><P>Stay tuned, and feel free to drop your questions and experiences in the comments below!</P><P><EM>For official documentation, refer to the </EM><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/authentication-fa6eec4f9ffc45aa89f8a2155b855ca4" target="_blank" rel="noopener noreferrer"><EM>SAP Help Portal – Authentication Policy for API Artifacts</EM></A></P> 2026-04-05T02:59:56.314000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/step-by-step-guide-real-time-currency-conversion-using-sap-integration/ba-p/14361124 Step-by-Step Guide: Real Time Currency Conversion using SAP Integration Suite (CPI) 2026-04-06T09:44:32.392000+02:00 tuhinpaul https://community.sap.com/t5/user/viewprofilepage/user-id/2288297 <H2 id="toc-hId-1793185544">Introduction</H2><DIV><P>In r<SPAN>eal-world integration scenarios,</SPAN>&nbsp;integrations are never limited to just data movement. Very often, they also involve business logic that needs to be accurate, reliable, and understandable for non‑technical users. One such recurring requirement encounters is <STRONG>currency conversion</STRONG>.</P><P><SPAN>Whether it’s for reporting, billing, or analytics, converting currency values accurately and in real time is an important requirement.</SPAN></P><P>In this blog, I will be sharing a <STRONG>real‑time currency conversion iFlow</STRONG> that I designed and implemented using <STRONG>SAP Integration Suite (CPI)</STRONG>. This solution uses an external currency exchange‑rate API (RapidAPI) and delivers the result in a <STRONG>clean, email‑friendly output</STRONG>, along with <STRONG>robust exception handling</STRONG>.</P></DIV><HR /><H2 id="toc-hId-1596672039">Business Scenario</H2><DIV><P>The scenario is straightforward but very realistic:</P><UL><LI>A source system sends an amount in one currency</LI><LI>A target system expects the amount in another currency</LI><LI>The exchange rate must be <STRONG>live and reliable</STRONG></LI><LI>The final output should be <STRONG>human‑readable and user friendly</STRONG>, not just raw JSON</LI></UL><P>At the same time, the integration should not break silently when:</P><UL><LI>Mandatory fields are missing</LI><LI>The input payload is malformed</LI><LI>The external API is down</LI><LI>Any runtime exception occurs</LI></UL><P>This Integration scenario strictly follows all the mentioned points and ensures that it give accurate results and handle errors efficiently.</P></DIV><HR /><H2 id="toc-hId-1400158534">Input Payload (Source System to CPI)</H2><P>The source system (ie, Postman) sends a simple JSON payload:</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 3.05.12 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391509i39F9466BBBA68200/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 3.05.12 PM.png" alt="Screenshot 2026-03-31 at 3.05.12 PM.png" /></span></DIV></DIV></DIV></DIV></DIV></DIV><H3 id="toc-hId-1332727748">Mandatory Fields</H3><UL><LI><CODE>sourceCurrency</CODE> – currency to convert <STRONG>From</STRONG></LI><LI><CODE>targetCurrency</CODE> – currency to convert <STRONG>To</STRONG></LI><LI><CODE>sourceAmount</CODE> – amount to be converted</LI></UL><P><STRONG>NOTE:</STRONG></P><DIV>I have made a conscious decision to treat all three as mandatory.<BR />If even one is missing, the message is rejected immediately and routed to the <STRONG>Exception Subprocess</STRONG>.</DIV><HR /><H2 id="toc-hId-1007131524">High‑Level Architecture</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 12.04.37 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391239i9E5948AF429DB261/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 12.04.37 AM.png" alt="Screenshot 2026-03-31 at 12.04.37 AM.png" /></span></P><P>The integration flow consists of:</P><OL><LI><STRONG>HTTPS Sender</STRONG> – receives the request&nbsp;</LI><LI><STRONG>Content Modifier</STRONG> – stores RapidAPI host and key securely&nbsp;</LI><LI><STRONG>Groovy Script</STRONG> – validates input and extracts fields&nbsp;</LI><LI><STRONG>Request Reply</STRONG> – calls external exchange‑rate API&nbsp;</LI><LI><STRONG>JSON to XML Converter</STRONG> – prepares response for XSLT&nbsp;&nbsp;</LI><LI><STRONG>XSLT Mapping</STRONG> – beautifies output into HTML&nbsp;</LI><LI><STRONG>Mail Adapter</STRONG> – sends result to user&nbsp;</LI><LI><STRONG>Exception Subprocess</STRONG> – handles all runtime failures</LI></OL><DIV><HR /><H2 id="toc-hId-810618019">STEP 1: HTTPS Sender – Entry Point of the Integration Flow</H2><P>The integration flow begins with an <STRONG>HTTPS Sender Adapter</STRONG>, which acts as the entry point for the entire currency conversion process.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 2.54.30 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391494i02BBE1FF58AB6700/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 2.54.30 PM.png" alt="Screenshot 2026-03-31 at 2.54.30 PM.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 2.55.00 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391500iF760F814E2FA9655/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 2.55.00 PM.png" alt="Screenshot 2026-03-31 at 2.55.00 PM.png" /></span></P><H3 id="toc-hId-743187233">Purpose of HTTPS Sender</H3><UL><LI>Exposes the iFlow as a <STRONG>secure REST endpoint</STRONG></LI><LI>Receives the <STRONG>input JSON payload</STRONG> from the source system (Postman)</LI><LI><DIV>Secure by default and c<SPAN>ommonly used in real projects for inbound APIs</SPAN></DIV></LI></UL></DIV><HR /><H2 id="toc-hId-417591009">STEP 2: Content Modifier – Managing API Credentials</H2><DIV>Instead of hard‑coding the RapidAPI host and key inside a Groovy script, I stored them as <STRONG>headers in a Content Modifier</STRONG>.&nbsp;<SPAN>It makes the integration much more maintainable.</SPAN></DIV><DIV><UL><LI>Credentials are easy to change</LI><LI>Scripts remain clean</LI><LI>No risk of accidentally logging secrets</LI></UL></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 2.38.36 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391484i8A8784EB3107D8B6/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 2.38.36 PM.png" alt="Screenshot 2026-03-31 at 2.38.36 PM.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 2.40.07 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391487iB51797BFCFCEC7A2/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 2.40.07 PM.png" alt="Screenshot 2026-03-31 at 2.40.07 PM.png" /></span></P><HR /><H2 id="toc-hId-221077504">STEP 3: Groovy Script – Input Extraction &amp; Validation</H2><P>The Groovy script performs <STRONG>hard validation</STRONG>&nbsp;for the incoming payload.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.52.54 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391427i01EC4A5EF5567841/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.52.54 PM.png" alt="Screenshot 2026-03-31 at 1.52.54 PM.png" /></span></P><P><STRONG>Here is the Groovy Script:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.54.04 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391429i3BD3D64C560F9876/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.54.04 PM.png" alt="Screenshot 2026-03-31 at 1.54.04 PM.png" /></span></P><P>&nbsp;<SPAN>So in this Groovy script, I have :</SPAN></P><DIV><UL><LI>Parsed the JSON explicitly</LI><LI>Checked each mandatory field</LI><LI>Stored valid values as Exchange Properties</LI><LI>Throws a meaningful exception if any field is missing</LI></UL></DIV><P>This&nbsp;<STRONG>hard validation </STRONG>is&nbsp;crucial because <STRONG>CPI does not throw errors for missing JSON fields by default</STRONG>.</P><P>Because of this, invalid messages are stopped immediately and routed to the Exception Subprocess&nbsp;</P><HR /><H2 id="toc-hId-24563999">STEP 4: Request Reply – Calling the Exchange Rate API</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.45.31 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391426i2C6ABDBA2C73111F/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.45.31 PM.png" alt="Screenshot 2026-03-31 at 1.45.31 PM.png" /></span></P><P>The Request Reply step dynamically calls the external <STRONG>RapidAPI Currency Exchange endpoint</STRONG> using:</P><UL><LI>Source currency</LI><LI>Target currency</LI><LI>Secure headers from the Content Modifier</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.44.13 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391425i25DB54406F1064C7/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.44.13 PM.png" alt="Screenshot 2026-03-31 at 1.44.13 PM.png" /></span></P><P>And If the API:</P><UL class="lia-list-style-type-square"><LI>Times out</LI><LI>Returns an error</LI><LI>Is unreachable</LI></UL><P>Exception Subprocess handles the failure gracefully.</P><HR /><H2 id="toc-hId-175304851">STEP 5: JSON to XML Converter</H2><P>Since <STRONG>XSLT only works with XML</STRONG>, so i converted the API’s JSON response into XML.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.36.44 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391421iE151D67B9C421B39/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.36.44 PM.png" alt="Screenshot 2026-03-31 at 1.36.44 PM.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.39.19 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391422i6C0D0331A03C6919/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.39.19 PM.png" alt="Screenshot 2026-03-31 at 1.39.19 PM.png" /></span></P><DIV>This made:</DIV><UL class="lia-list-style-type-square"><LI><DIV>Mapping easier</DIV></LI><LI><DIV>Formatting predictable</DIV></LI><LI>Transformation logic much cleaner</LI></UL><HR /><H2 id="toc-hId--21208654">STEP 6: XSLT Mapping – Beautified HTML Output</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.50.52 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391264iE9B6FCE58264BA46/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.50.52 AM.png" alt="Screenshot 2026-03-31 at 1.50.52 AM.png" /></span></P><P><STRONG>Here is the XSLT Script:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 12.24.29 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391261iD7A7F941C2DCD819/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 12.24.29 AM.png" alt="Screenshot 2026-03-31 at 12.24.29 AM.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.44.28 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391262iF2DB90DAC51BF83E/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.44.28 AM.png" alt="Screenshot 2026-03-31 at 1.44.28 AM.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.44.47 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391263i0176BFC8C4AFD5A3/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.44.47 AM.png" alt="Screenshot 2026-03-31 at 1.44.47 AM.png" /></span></P><DIV>&nbsp;</DIV><DIV>Instead of returning raw API data in JSON, I used XSLT to generate a <STRONG>beautiful&nbsp;modern HTML card</STRONG>, optimized for email clients.</DIV><P>Features that i have focused for beautification includes:</P><UL class="lia-list-style-type-square"><LI>A green glowing success card&nbsp;</LI><LI>Currency symbols&nbsp;</LI><LI>Proper decimal formatting&nbsp;</LI><LI>Email‑safe inline CSS&nbsp;</LI><LI>Readable and user friendly</LI></UL><HR /><H2 id="toc-hId--217722159">STEP 7: Mail Adapter – Delivering the Result</H2><P>The Mail Adapter sends:</P><UL><LI>The formatted HTML</LI><LI>Clean layout</LI><LI>No broken styling</LI><LI>Compatible with Outlook, Gmail, mobile clients</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 2.12.41 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391265i74E868F0BA6AF50A/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 2.12.41 AM.png" alt="Screenshot 2026-03-31 at 2.12.41 AM.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 2.15.58 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391266iCC473CCDC8D40613/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 2.15.58 AM.png" alt="Screenshot 2026-03-31 at 2.15.58 AM.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 2.18.15 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391267iB3FD09797C83F7F4/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 2.18.15 AM.png" alt="Screenshot 2026-03-31 at 2.18.15 AM.png" /></span></P><HR /><H2 id="toc-hId--414235664">STEP 8: Exception Subprocess – For Error Handling</H2><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 2.29.54 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391268i0130A110B2027AAA/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 2.29.54 AM.png" alt="Screenshot 2026-03-31 at 2.29.54 AM.png" /></span></P><P>The Exception Subprocess ensures there are <STRONG>no silent failures and handles errors effectively</STRONG>.</P><P><STRONG>Here's what the Groovy script does:</STRONG></P><UL><LI>Captures runtime errors</LI><LI>Identifies <STRONG>what actually went wrong</STRONG></LI><LI>Categorizes the error:<UL class="lia-list-style-type-square"><LI>Missing mandatory fields</LI><LI>Malformed JSON</LI><LI>External API failure</LI><LI>Script execution error</LI></UL></LI><LI>Generates modern card formation using HTML for Beautification&nbsp;</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 2.35.47 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391269i1AF7FB8E684A3461/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 2.35.47 AM.png" alt="Screenshot 2026-03-31 at 2.35.47 AM.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 2.36.15 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391270i48FD8F37C4B7F17B/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 2.36.15 AM.png" alt="Screenshot 2026-03-31 at 2.36.15 AM.png" /></span></P><H3 id="toc-hId--904152176">Here what the Error Mail Adapter does:</H3><UL><LI>Send a <STRONG>structured and well formatted HTML error email</STRONG>, just like as for success mail</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.19.49 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391414iE00BE67CEBA8E12D/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.19.49 PM.png" alt="Screenshot 2026-03-31 at 1.19.49 PM.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-03-31 at 1.20.27 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391415i72C76A81E3205112/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-03-31 at 1.20.27 PM.png" alt="Screenshot 2026-03-31 at 1.20.27 PM.png" /></span></P><HR /><H2 id="toc-hId--807262674">Success Email Output:</H2><UL><LI>Gives successful currency conversion information dynamically</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Media (8).jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391527iC4CB5A15FE8287D4/image-size/large?v=v2&amp;px=999" role="button" title="Media (8).jpeg" alt="Media (8).jpeg" /></span></P><HR /><H2 id="toc-hId--1003776179">Error Email Output:</H2><UL><LI>Gives Error message and its possible causes in case of any error</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Media (9).jpeg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/391528i9C64E2895B2A561B/image-size/large?v=v2&amp;px=999" role="button" title="Media (9).jpeg" alt="Media (9).jpeg" /></span></P><HR /><H2 id="toc-hId--1200289684">Key benefits of this approach&nbsp;</H2><OL><LI>Robust mandatory field validation</LI><LI>Secure credential handling</LI><LI>Professional, email‑ready output</LI><LI>User‑friendly error messages</LI><LI>Reusable iFlow pattern for other APIs</LI><LI>Fully Externalized Parameters&nbsp;</LI></OL><HR /><H2 id="toc-hId--1396803189">Conclusion</H2><DIV><P>This currency conversion iFlow shows how SAP Integration Suite can be used for much more than just routing messages.</P><P>I was able to build an integration that is <STRONG>stable, readable, and production‑ready</STRONG>.</P></DIV><P>This implementation helped me better understand how to design flexible and maintainable integration flows, especially when dealing with real-world requirements.</P><P>I hope this experience helps others who are working on similar scenarios in SAP Cloud Integration.</P><DIV><P>If you found this blog helpful:</P><UL class="lia-list-style-type-square"><LI><STRONG>Like the blog</STRONG></LI><LI><STRONG>Share it&nbsp;</STRONG></LI><LI><STRONG>Feel free to comment or ask questions</STRONG></LI></UL><P><STRONG>Happy Integrating !</STRONG></P></DIV> 2026-04-06T09:44:32.392000+02:00 https://community.sap.com/t5/integration-blog-posts/automating-sap-cpi-deployment-validation-integrationruntimeartifacts-api-in/ba-p/14346564 Automating SAP CPI Deployment Validation : IntegrationRuntimeArtifacts API in Real-Time Monitoring 2026-04-06T13:09:45.902000+02:00 rohitparihar https://community.sap.com/t5/user/viewprofilepage/user-id/882438 <H2 id="toc-hId-1791491425">Background &amp; Problem Statement</H2><P>As an integration developer we know that&nbsp;our SAP Integration Suite landscape handles hundreds of integration flows across multiple environments —<SPAN>&nbsp;</SPAN><STRONG>Dev, QA, Pre-Prod/Production</STRONG>.</P><P>In many release cycles, our team faces a few pain points like:</P><P>Deployed iFlow → Assumed it started → Found error hours later<BR />Wrong version deployed → No one noticed until message failures<BR />Manual checks → Time-consuming → Human error prone<BR />No centralized visibility → Each team checking independently</P><P>We can have an<SPAN>&nbsp;</SPAN><STRONG>automated, programmatic way</STRONG><SPAN>&nbsp;</SPAN>to:</P><OL><LI>Verify deployment success immediately after release</LI><LI>Check runtime status in real-time</LI><LI>Integrate this check into our<SPAN>&nbsp;</SPAN><STRONG>CI/CD pipeline</STRONG></LI></OL><H2 id="toc-hId-1594977920">Discovering the API</H2><P>SAP Integration Suite exposes a rich set of<SPAN>&nbsp;</SPAN><STRONG>OData APIs</STRONG><SPAN>&nbsp;</SPAN>for managing and monitoring integration artifacts.</P><P><EM>The key API I used:</EM></P><P><FONT color="#FF0000">GET /api/v1/IntegrationRuntimeArtifacts('{iflowID}')</FONT></P><P><EM>what this API returns:</EM></P><DIV><DIV><DIV><FONT color="#FF0000"><SPAN>&nbsp;&nbsp;</SPAN><SPAN>&lt;</SPAN><SPAN>properties</SPAN><SPAN>&gt;</SPAN></FONT></DIV></DIV></DIV><pre class="lia-code-sample language-markup"><code>&lt;Id&gt;jmsChecksdummy2&lt;/Id&gt; &lt;Version&gt;1.0.0&lt;/Version&gt; &lt;Name&gt;jmsChecksdummy2&lt;/Name&gt; &lt;Type&gt;INTEGRATION_FLOW&lt;/Type&gt; &lt;DeployedBy&gt;Rohit.Parihar@syngenta.com&lt;/DeployedBy&gt; &lt;DeployedOn&gt;2026-02-25T09:46:43.180&lt;/DeployedOn&gt; &lt;Status&gt;STARTED&lt;/Status&gt;</code></pre><DIV><FONT color="#FF0000"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN>&lt;/</SPAN><SPAN>properties&gt;</SPAN></FONT></DIV><DIV>&nbsp;</DIV><DIV><STRONG>Design:</STRONG><SPAN>&nbsp;I understand that the CPI developer does not need steps on how to create the flow and utilize the objects however, I am pasting the flow skeleton here for reference.</SPAN></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rohitparihar_0-1773238356051.png" style="width: 775px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/382291iB620DB70C2CBF3D5/image-dimensions/775x237?v=v2" width="775" height="237" role="button" title="rohitparihar_0-1773238356051.png" alt="rohitparihar_0-1773238356051.png" /></span><UL><LI>I've used two integration processes, both of which can run independently. One runs on a timer-based schedule and the other through an external system using a REST endpoint.</LI><LI>The body remains the same but can be dynamically modified to fetch information for multiple artifacts at once. Since it is externalized, it can be configured without editing the flow.</LI><LI>The payload can also be logged in the message processing logs. This is condition-based, meaning if the&nbsp;Log Payload&nbsp;flag as header is set to true, the payload will be logged otherwise, it will not.</LI></UL></DIV><DIV>&nbsp;One of the example of the input I'm passing and the response is pasted below.</DIV><DIV>&lt;root&gt;<BR />&lt;iflowID&gt;jmsChecksDummy&lt;/iflowID&gt;<BR />&lt;iflowID&gt;jmsChecks&lt;/iflowID&gt;<BR />&lt;/root&gt;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rohitparihar_1-1773238732022.png" style="width: 550px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/382292iFB6D3729B90D9125/image-dimensions/550x341?v=v2" width="550" height="341" role="button" title="rohitparihar_1-1773238732022.png" alt="rohitparihar_1-1773238732022.png" /></span><P>&nbsp;</P><P>&nbsp;</P><H3 id="toc-hId-742355966" id="toc-hId-1527547134"><SPAN>Conclusion</SPAN></H3><P>The information is helpful for identifying versions mismatch, changes and stage of runtime artifacts in real time.</P><P>Note: designtime artifacts information will not include status information.</P><P>Hope this helps someone someday, happy learning!</P></DIV> 2026-04-06T13:09:45.902000+02:00 https://community.sap.com/t5/artificial-intelligence-blogs-posts/how-i-connected-claude-ai-to-my-sap-abap-system-using-mcp-a-complete/ba-p/14365831 How I Connected Claude AI to My SAP ABAP System Using MCP — A Complete Windows Guide 2026-04-07T12:35:07.976000+02:00 Ahmed_Mosbah https://community.sap.com/t5/user/viewprofilepage/user-id/2292286 <P class=""><STRONG>Introduction</STRONG></P><P>The SAP developer community has been buzzing about connecting Claude AI&nbsp;directly to live SAP ABAP systems using MCP (Model Context Protocol) — reading code, modifying objects, creating transports, and activating changes, all from a natural language chat interface.</P><P>I tried it myself on Windows, and it works. This blog walks you through exactly how to set it up.</P><HR /><P class=""><STRONG>What is MCP?</STRONG></P><P class="">MCP (Model Context Protocol) is an open standard that lets AI models like Claude connect to external tools and data sources. Think of it as a plugin system for AI — instead of just answering questions from training data, Claude can actually <EM>call tools</EM> that interact with real systems.</P><P class="">For SAP developers, this means Claude can:</P><UL class=""><LI>Read your actual ABAP code directly from your system</LI><LI>Write and modify objects</LI><LI>Run syntax checks</LI><LI>Create transport requests</LI><LI>Activate objects</LI></UL><P class="">All without you copy-pasting anything.</P><HR /><P class=""><STRONG>The Architecture</STRONG></P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class=""><PRE><CODE><SPAN>Claude Desktop / Claude Code CLI</SPAN><SPAN> ↕ MCP Protocol</SPAN><SPAN> ┌──────────────────────────┐</SPAN><SPAN> │ mcp-abap-adt │ ← Read-only (13 tools)</SPAN><SPAN> │ mcp-abap-abap-adt-api │ ← Full CRUD (30 tools)</SPAN><SPAN> └──────────────────────────┘</SPAN><SPAN> ↕ ADT REST API</SPAN><SPAN> Your SAP ABAP System</SPAN></CODE></PRE></DIV></DIV><P class="">Both MCP servers were built by Mario Andreschak and communicate with SAP via the same ADT (ABAP Development Tools) API that Eclipse uses under the hood.</P><HR /><P class=""><STRONG>Prerequisites</STRONG></P><P class="">Before starting, you need:</P><UL class=""><LI>Windows 10 or 11 (64-bit)</LI><LI>An SAP ABAP system with <CODE>/sap/bc/adt</CODE> active in SICF</LI><LI>A user with <CODE>SAP_ADT_DEVELOPER</CODE> role (or equivalent)</LI><LI>A Claude Pro/Max/Team subscription at claude.ai</LI><LI>Internet connection</LI></UL><HR /><P class=""><STRONG>Step 1 — Install Node.js</STRONG></P><P class="">Node.js is the runtime required by Claude Code CLI and the MCP servers.</P><OL class=""><LI>Go to <STRONG><A class="" href="https://nodejs.org" target="_blank" rel="noopener nofollow noreferrer">https://nodejs.org</A></STRONG> and download the LTS version</LI><LI>Install with all defaults</LI><LI>Verify in Command Prompt:</LI></OL><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class=""><PRE><CODE><SPAN>node -v → v24.x.x</SPAN><SPAN>npm -v → 11.x.x</SPAN></CODE></PRE></DIV></DIV><HR /><P class=""><STRONG>Step 2 — Install Git for Windows</STRONG></P><P class="">Git provides the bash shell Claude Code requires on Windows.</P><OL class=""><LI>Go to <STRONG><A class="" href="https://git-scm.com/downloads/win" target="_blank" rel="noopener nofollow noreferrer">https://git-scm.com/downloads/win</A></STRONG> and download the installer</LI><LI>During setup, on the PATH screen select: <EM>"Git from the command line and also from 3rd-party software"</EM></LI><LI>Complete with all other defaults</LI></OL><HR /><P class=""><STRONG>Step 3 — Install Claude Code CLI</STRONG></P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class="">cmd</DIV><DIV class=""><PRE><CODE><SPAN>npm install -g @anthropic-ai/claude-code</SPAN><SPAN>claude --version</SPAN></CODE></PRE></DIV></DIV><P class="">Then log in:</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class="">cmd</DIV><DIV class=""><PRE><CODE><SPAN>claude</SPAN></CODE></PRE></DIV></DIV><P class="">Select option 1 (Claude subscription), log in via browser, return to terminal.</P><HR /><P class=""><STRONG>Step 4 — Install mcp-abap-adt (Read-Only MCP Server)</STRONG></P><P class="">This server gives Claude read access to your SAP system with 13 tools including GetProgram, GetClass, GetFunction, GetTable, SearchObject, and more.</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class="">cmd</DIV><DIV class=""><PRE><CODE><SPAN>mkdir C:\Tools</SPAN><SPAN>cd C:\Tools</SPAN><SPAN>git clone https://github.com/mario-andreschak/mcp-abap-adt</SPAN><SPAN>cd mcp-abap-adt</SPAN><SPAN>npm install</SPAN><SPAN>npm run build</SPAN></CODE></PRE></DIV></DIV><P class="">Create a <CODE>.env</CODE> file in the folder:</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class=""><PRE><CODE><SPAN>SAP_URL=https://your-sap-system.com:44300</SPAN><SPAN>SAP_USERNAME=YOUR_USERNAME</SPAN><SPAN>SAP_PASSWORD=YOUR_PASSWORD</SPAN><SPAN>SAP_CLIENT=300</SPAN><SPAN>TLS_REJECT_UNAUTHORIZED=0</SPAN></CODE></PRE></DIV></DIV><P class="">Register with Claude Code:</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class="">cmd</DIV><DIV class=""><PRE><CODE><SPAN>claude mcp add mcp-abap-adt node C:/Tools/mcp-abap-adt/dist/index.js</SPAN><SPAN>claude mcp list</SPAN></CODE></PRE></DIV></DIV><P class="">You should see: <CODE>mcp-abap-adt: ✓ Connected</CODE></P><HR /><P class=""><STRONG>Step 5 — Install mcp-abap-abap-adt-api (Full CRUD Server)</STRONG></P><P class="">This is the powerful one — 30 tools including read, write, syntax check, activate, lock/unlock, and transport management.</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class="">cmd</DIV><DIV class=""><PRE><CODE><SPAN>cd C:\Tools</SPAN><SPAN>git clone https://github.com/mario-andreschak/mcp-abap-abap-adt-api.git</SPAN><SPAN>cd mcp-abap-abap-adt-api</SPAN><SPAN>npm install</SPAN><SPAN>npm run build</SPAN></CODE></PRE></DIV></DIV><P class="">Create <CODE>.env</CODE> (note: slightly different variable names):</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class=""><PRE><CODE><SPAN>SAP_URL=https://your-sap-system.com:44300</SPAN><SPAN>SAP_USER=YOUR_USERNAME</SPAN><SPAN>SAP_PASSWORD=YOUR_PASSWORD</SPAN><SPAN>SAP_CLIENT=300</SPAN><SPAN>SAP_LANGUAGE=EN</SPAN><SPAN>NODE_TLS_REJECT_UNAUTHORIZED=0</SPAN></CODE></PRE></DIV></DIV><P class="">Register:</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class="">cmd</DIV><DIV class=""><PRE><CODE><SPAN>claude mcp add mcp-abap-adt-api node C:/Tools/mcp-abap-abap-adt-api/dist/index.js</SPAN></CODE></PRE></DIV></DIV><HR /><P class=""><STRONG>Step 6 — Setup Claude Desktop (GUI Interface)</STRONG></P><P class="">Claude Desktop is where it really comes alive — a beautiful chat UI like the LinkedIn video.</P><OL class=""><LI>Download from <STRONG><A class="" href="https://claude.ai/download" target="_blank" rel="noopener nofollow noreferrer">https://claude.ai/download</A></STRONG></LI><LI>Install and log in</LI><LI>Go to <STRONG>☰ → Settings → Developer → Edit Config</STRONG></LI><LI>Replace the content with:</LI></OL><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class="">json</DIV><DIV class=""><PRE><CODE><SPAN><SPAN class="">{</SPAN> </SPAN><SPAN> <SPAN class="">"mcpServers"</SPAN><SPAN class="">:</SPAN> <SPAN class="">{</SPAN> </SPAN><SPAN> <SPAN class="">"mcp-abap-adt"</SPAN><SPAN class="">:</SPAN> <SPAN class="">{</SPAN> </SPAN><SPAN> <SPAN class="">"command"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"C:\\Program Files\\nodejs\\node.exe"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"args"</SPAN><SPAN class="">:</SPAN> <SPAN class="">[</SPAN><SPAN class="">"C:\\Tools\\mcp-abap-adt\\dist\\index.js"</SPAN><SPAN class="">]</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"env"</SPAN><SPAN class="">:</SPAN> <SPAN class="">{</SPAN> </SPAN><SPAN> <SPAN class="">"SAP_URL"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"https://your-sap-system.com:44300"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"SAP_USERNAME"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"YOUR_USERNAME"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"SAP_PASSWORD"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"YOUR_PASSWORD"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"SAP_CLIENT"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"300"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"TLS_REJECT_UNAUTHORIZED"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"0"</SPAN> </SPAN><SPAN> <SPAN class="">}</SPAN> </SPAN><SPAN> <SPAN class="">}</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"mcp-abap-adt-api"</SPAN><SPAN class="">:</SPAN> <SPAN class="">{</SPAN> </SPAN><SPAN> <SPAN class="">"command"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"C:\\Program Files\\nodejs\\node.exe"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"args"</SPAN><SPAN class="">:</SPAN> <SPAN class="">[</SPAN><SPAN class="">"C:\\Tools\\mcp-abap-abap-adt-api\\dist\\index.js"</SPAN><SPAN class="">]</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"env"</SPAN><SPAN class="">:</SPAN> <SPAN class="">{</SPAN> </SPAN><SPAN> <SPAN class="">"SAP_URL"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"https://your-sap-system.com:44300"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"SAP_USER"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"YOUR_USERNAME"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"SAP_PASSWORD"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"YOUR_PASSWORD"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"SAP_CLIENT"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"300"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"SAP_LANGUAGE"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"EN"</SPAN><SPAN class="">,</SPAN> </SPAN><SPAN> <SPAN class="">"NODE_TLS_REJECT_UNAUTHORIZED"</SPAN><SPAN class="">:</SPAN> <SPAN class="">"0"</SPAN> </SPAN><SPAN> <SPAN class="">}</SPAN> </SPAN><SPAN> <SPAN class="">}</SPAN> </SPAN><SPAN> <SPAN class="">}</SPAN> </SPAN><SPAN><SPAN class="">}</SPAN></SPAN></CODE></PRE></DIV></DIV><BLOCKQUOTE><P class=""><span class="lia-unicode-emoji" title=":warning:">⚠️</span> <STRONG>Windows-specific tip:</STRONG> You MUST use the full path <CODE>C:\\Program Files\\nodejs\\node.exe</CODE> — using just <CODE>"node"</CODE> does not work in Claude Desktop on Windows. Also note double backslashes <CODE>\\</CODE> in all paths.</P></BLOCKQUOTE><OL class=""><LI>Kill Claude in Task Manager and reopen</LI><LI>Go back to Settings → Developer — you should see both servers listed as <STRONG>running</STRONG> <span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span></LI></OL><HR /><P class=""><STRONG>Step 7 — Add Free Official SAP MCP Servers</STRONG></P><P class="">Bonus: Claude Desktop has a built-in directory of official SAP MCP servers. Click <EM>"Connect your tools to Claude"</EM> at the bottom of the chat, search for "SAP", and add:</P><UL class=""><LI><STRONG>SAPUI5 MCP Server</STRONG> — for UI5 development</LI><LI><STRONG>SAP CAP MCP Server</STRONG> — for CAP projects</LI><LI><STRONG>SAP Fiori MCP Server</STRONG> — for Fiori Elements apps</LI></UL><P class="">Also add these free hosted servers to Claude Code CLI (no installation needed):</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class="">cmd</DIV><DIV class=""><PRE><CODE><SPAN>claude mcp add --transport http abap-docs https://mcp-abap.marianzeis.de/mcp</SPAN><SPAN>claude mcp add --transport http sap-docs https://mcp-sap-docs.marianzeis.de/mcp</SPAN></CODE></PRE></DIV></DIV><P class="">These give Claude access to the full ABAP keyword documentation across 8 SAP releases, ABAP cheat sheets, CAP docs, UI5 docs, and SAP Community posts.</P><HR /><P class=""><STRONG>Testing It</STRONG></P><P class="">Open Claude Desktop, create a New Chat, and type:</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class=""><PRE><CODE><SPAN>Get the source code of program SAPMV45A</SPAN></CODE></PRE></DIV></DIV><P class="">Watch Claude automatically call your SAP system, retrieve the source code, and explain it — all in seconds.</P><P class="">For write operations (test on $TMP objects only!):</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class=""><PRE><CODE><SPAN>Find a simple Z program in $TMP, add a comment at the top </SPAN><SPAN>saying "Modified by Claude", save and activate it</SPAN></CODE></PRE></DIV></DIV><P class="">For complex workflows like the LinkedIn video:</P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><DIV class="">&nbsp;</DIV></DIV></DIV></DIV></DIV><DIV class=""><PRE><CODE><SPAN>Connect to my SAP system. Copy class ZCL_SOURCE from package </SPAN><SPAN>ZPKG_A into ZPKG_B, rename it to ZCL_TARGET, change the </SPAN><SPAN>carrier_id in the SELECT for /DMO/CONNECTION, create a </SPAN><SPAN>transport and activate.</SPAN></CODE></PRE></DIV></DIV><HR /><P class=""><STRONG>Security Notes</STRONG></P><UL class=""><LI>Never commit <CODE>.env</CODE> files to Git</LI><LI>Change your SAP password if shared in screenshots</LI><LI>Use dedicated service accounts with minimum required authorizations</LI><LI>Only test write operations in $TMP before moving to real packages</LI><LI>The <CODE>TLS_REJECT_UNAUTHORIZED=0</CODE> flag disables SSL validation — use only in dev environments</LI><LI>Check your company's AI policy before sending code to external APIs</LI></UL><HR /><P class=""><STRONG>My Experience</STRONG></P><P class="">What surprised me most is how Claude handles the entire workflow autonomously. It doesn't just write code — it searches for the object, reads the source, understands the structure, reads class includes, creates the transport, locks the object, writes the code, runs a syntax check, activates, and unlocks. All from one natural language request.</P><P class="">&nbsp;</P><P class=""><STRONG>Important Hint</STRONG></P><P class="">It can make ABAP-specific mistakes (like forgetting RAP locking fields, or using reserved DDIC words). Always review AI-generated code before activating in production. But as a development accelerator and code reviewer, it's genuinely powerful.</P><HR /><P class=""><STRONG>References</STRONG></P><UL class=""><LI>GitHub: <A class="" href="https://github.com/mario-andreschak/mcp-abap-adt" target="_blank" rel="noopener nofollow noreferrer">mcp-abap-adt</A> — Mario Andreschak</LI><LI>GitHub: <A class="" href="https://github.com/mario-andreschak/mcp-abap-abap-adt-api" target="_blank" rel="noopener nofollow noreferrer">mcp-abap-abap-adt-api</A> — Mario Andreschak</LI><LI>GitHub: <A class="" href="https://github.com/secondsky/sap-skills" target="_blank" rel="noopener nofollow noreferrer">sap-skills</A> — 35 Claude Code plugins for SAP</LI><LI>Blog: <A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/feed-sap-help-ui5-apis-amp-sap-community-content-into-your-ai-with-this/ba-p/14195007" target="_blank">SAP Docs MCP Server</A> — Marian Zeis</LI><LI>Blog: <A class="" href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/claude-code-via-mcp-poor-man-s-joule-or-a-practical-tool/ba-p/14344261" target="_blank">Claude Code via MCP</A> — SAP Community</LI><LI>Blog: <A class="" href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/installing-and-extending-an-abap-mcp-server-by-vibe-coding-with-claude-code/ba-p/14343600" target="_blank">Installing and Extending an ABAP MCP Server</A> — SAP Community</LI></UL><HR /><P class=""><EM>I hope this helps other ABAP developers get started. If you run into issues or have questions, feel free to comment below. Happy coding!</EM></P> 2026-04-07T12:35:07.976000+02:00 https://community.sap.com/t5/technology-blog-posts-by-sap/designing-file-processing-in-btp-integration-suite-with-amazon-s3-and/ba-p/14330098 Designing File Processing in BTP Integration Suite with Amazon S3 and Apache POI 2026-04-07T15:48:35.411000+02:00 Avinash_Vaidya https://community.sap.com/t5/user/viewprofilepage/user-id/120687 <H2 id="toc-hId-1790384450">Introduction</H2><P>Even in the world of AI and LLMs, file-based interfaces are still very common in enterprise landscape. Legacy systems and external applications often exchange operational data in spreadsheet form, even when the downstream integration landscape is API-driven. This creates an interesting architectural challenge for the middleware layer to perform controlled document-level transformations along with integration.</P><P>Recently, I came across a use case where an Excel file placed in an Object Store had to be picked up by SAP Cloud Integration, enriched with additional data and written back. At first glance, this looked like a straightforward file transfer requirement. However, the real question was not about moving the file from one folder to another, but about deciding how the data-level processing should be performed and how much should responsibly sit within the integration layer.<BR /><BR />I thought this would be a good opportunity to document my learning through a practical end-to-end scenario. In this blog, I will focus on five key aspects:</P><OL><LI>Provisioning and using Amazon S3 as the object store through SAP BTP.</LI><LI>Configuring and performing S3 operations through AWS CLI.</LI><LI>Connecting SAP Cloud Integration to the S3 bucket using the AmazonWebServices adapter.</LI><LI>Integrating external open-source libraries (example: Apache POI) into Cloud Integration.</LI><LI>Finally, Groovy script to perform document-level processing and writing the file back to S3.</LI></OL><P>I have tried to keep it simple and the motive behind this blog is to showcase the possibilities and give a starting point for developers and consultants.</P><H3 id="toc-hId-1722953664">1. Provisioning and using Amazon S3 as the object store through SAP BTP:</H3><P>I chose to explore SAP BTP Object store as a part of this journey. You can very well substitute it with SFTP server for file based integration as well.&nbsp; You can very well search for <STRONG>Object Store&nbsp;</STRONG>from the Service Marketplace of your BTP subaccount. Refer below diagram:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="service_market_place.png" style="width: 887px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392763iD2A48C979AB8B591/image-size/large?v=v2&amp;px=999" role="button" title="service_market_place.png" alt="service_market_place.png" /></span></P><P class="lia-align-center" style="text-align: center;">&nbsp;Figure 1: Object Store Service</P><P class="lia-align-left" style="text-align : left;">Create a service instance.<SPAN>This service is specific to the infrastructure layer such as Azure Blob Storage, Amazon Web Services, and Google Cloud Platform. In my case as my BTP subaccount is provisioned on AWS, S3 instance will be created.</SPAN></P><P class="lia-align-left" style="text-align : left;"><SPAN>Once the instance is successfully created, create a service key with preferred name, for example: <STRONG>sandbox-object-store-service-key.</STRONG> This service key will provide all the metadata for the provisioned S3 bucket.</SPAN></P><H3 id="toc-hId-1526440159">2. Configuring and performing S3 operations through AWS CLI:</H3><P>I wanted a simple way to validate the S3 bucket outside SAP Cloud Integration before using it into the iFlow. AWS CLI was the choice because it allowed me to upload, download, list, and delete files directly from the terminal. That made it useful not only for initial setup, but also for end-to-end validation of the overall integration flow.</P><H4 id="toc-hId-1459009373">Installing AWS CLI</H4><pre class="lia-code-sample language-bash"><code>brew install awscli</code></pre><pre class="lia-code-sample language-bash"><code>aws --version</code></pre><P>If AWS CLI is installed correctly, you should see the version details.</P><H4 id="toc-hId-1262495868">Configuring AWS CLI</H4><pre class="lia-code-sample language-bash"><code>aws configure</code></pre><P>The above command will ask you to enter below details</P><OL><LI>Access Key ID</LI><LI>Secret Access Key</LI><LI>Region</LI><LI>Output format (default it to: json)</LI></OL><P>All the above details can be obtained from the service key which you have created in the above section.</P><P>You can check of the attributes are added to the configuration using the below command</P><pre class="lia-code-sample language-bash"><code>aws configure list</code></pre><H4 id="toc-hId-1065982363">Connecting to the S3 Bucket</H4><pre class="lia-code-sample language-bash"><code>aws s3 ls "s3://&lt;bucket-name-from-service-key&gt;/inbound/"</code></pre><P>This is an important validation step. If the command succeeds, it confirms that:</P><UL><LI>The CLI is installed correctly</LI><LI>Credentials are valid</LI><LI>Configured endpoint is correct</LI><LI>Access policy allows listing the bucket</LI></UL><H4 id="toc-hId-869468858">Uploading a File to S3</H4><P>I created a excel file which contains some predefined data as shown below</P><TABLE border="0" width="261" cellspacing="0" cellpadding="0"><COLGROUP><COL width="87" /></COLGROUP><TBODY><TR><TD width="87" height="21">Col1</TD><TD width="87">Col2</TD><TD width="87">Col3</TD></TR><TR><TD height="21">1</TD><TD>2</TD><TD>3</TD></TR><TR><TD height="21">4</TD><TD>5</TD><TD>6</TD></TR><TR><TD height="21">7</TD><TD>8</TD><TD>9</TD></TR></TBODY></TABLE><P>Using the following command, you can upload the file from your local machine to S3 bucket.</P><pre class="lia-code-sample language-bash"><code>aws s3 cp "/Users/&lt;Directory&gt;/Desktop/Book1.xlsx" "s3://&lt;bucket-name&gt;/inbound/Book1.xlsx"</code></pre><P>Once done you can check by listing the files in the inbound directory</P><pre class="lia-code-sample language-bash"><code>aws s3 ls "s3://&lt;bucket-name-from-service-key&gt;/inbound/"</code></pre><P>With this, you have successfully configured S3 bucket and uploaded files.</P><H3 id="toc-hId-543872634">3. Connecting SAP Cloud Integration to the S3 with AmazonWebServices adapter:</H3><P>To connect Cloud Integration with Amazon S3, SAP provides the <STRONG>AmazonWebServices </STRONG>adapter.&nbsp; As per the&nbsp;Cloud Integration adapter documentation, this adapter supports <STRONG>S3</STRONG> for both sender and receiver scenarios. For more details you can check the <A href="https://api.sap.com/package/AmazonWebServicesAdapter/overview" target="_self" rel="noopener noreferrer">Business Accelerator Hub</A></P><P>To start with I created an integration flow as shown in the below image<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="s3_iFlow.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392767i951A719650C7EE38/image-size/large?v=v2&amp;px=999" role="button" title="s3_iFlow.png" alt="s3_iFlow.png" /></span></P><P class="lia-align-center" style="text-align: center;">&nbsp;Figure 2: Integration Flow</P><P>The above integration flow performs below tasks:</P><OL><LI>Leverages "AmazonWebServices" receiver adapter to read file from S3 bucket.</LI><LI>Logs the file metadata</LI><LI>Reads the excel workbook and adds data to the existing row (You can enrich data from external API as well and extend this use case).</LI><LI>Uploads the updated file to the S3 bucket using "AmazonWebServices" receiver adapter for write operation.</LI></OL><P>For reference, I provided the screenshot of the adapter configuration<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="adapter_config.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392770i80868CCF6787255F/image-size/large?v=v2&amp;px=999" role="button" title="adapter_config.png" alt="adapter_config.png" /></span></P><P class="lia-align-center" style="text-align: center;">&nbsp;Figure 3: AWS Adapter Config</P><H3 id="toc-hId-347359129">4. Integrating external open-source libraries (example: Apache POI) into Cloud Integration:</H3><P>Standard Groovy scripting alone was not sufficient because the requirement was to read and update Excel workbook content directly. That introduced the need for an external library capable of working with spreadsheet structures such as workbooks, sheets, rows, and cells. After further exploring, I used <STRONG>Apache POI</STRONG>, which is a widely used open-source Java library for Microsoft Office document processing.</P><P>You can add external archives to be referenced in the groovy script. This makes it possible to bring in third-party libraries when the use case goes beyond what the standard runtime APIs provide. You can do it from the <STRONG>References&nbsp;</STRONG>section as shown below<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="references_archives.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392773i157E8B5585F0733A/image-size/large?v=v2&amp;px=999" role="button" title="references_archives.png" alt="references_archives.png" /></span></P><P class="lia-align-center" style="text-align: center;">&nbsp;Figure 4: Archives</P><P class="lia-align-left" style="text-align : left;">Following JARs are imported in the integration flow:</P><OL><LI>commons-collections4-4.1.jar</LI><LI>poi-3.17.jar</LI><LI>poi-ooxml-3.17.jar</LI><LI>poi-ooxml-schemas-3.17.jar</LI><LI>xmlbeans-2.6.0.jar</LI></OL><P class="lia-align-left" style="text-align : left;"><STRONG>Important Note:</STRONG> A practical example of this pattern is Apache POI, but the same concept can also be applied to other well-scoped open-source libraries when there is a clear functional reason to do so and the additional dependency remains manageable, secured and as per licensing agreements.</P><H3 id="toc-hId-150845624">5. Groovy script to perform document-level processing and writing the file back to S3.</H3><P class="lia-align-left" style="text-align : left;">Once the connectivity to S3 was established and the Apache POI libraries were imported in the integration flow, the data processing logic is implemented in a Groovy script.<BR />The Groovy script shown below is a good starting point to demonstrate data handling and enrichment in SAP Cloud Integration using Apache POI. In this example, I update the excel worksheet by adding a new column (SUM) and populating it with the summation of the first three columns for each data row. Eventually the data is saved in a new file named : <STRONG>Book2.xlsx</STRONG></P><pre class="lia-code-sample language-java"><code>import com.sap.it.script.v2.api.Message import org.apache.poi.ss.usermodel.Cell import org.apache.poi.ss.usermodel.DataFormatter import org.apache.poi.ss.usermodel.Row import org.apache.poi.ss.usermodel.Sheet import org.apache.poi.ss.usermodel.Workbook import org.apache.poi.xssf.usermodel.XSSFWorkbook import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream def Message processData(Message message) { byte[] body = message.getBody(byte[].class) if (!body) { throw new IllegalStateException('Payload is empty') } Workbook workbook try { workbook = new XSSFWorkbook(new ByteArrayInputStream(body)) Sheet sheet = workbook.getSheetAt(0) DataFormatter formatter = new DataFormatter() int headerRowIndex = sheet.getFirstRowNum() Row headerRow = sheet.getRow(headerRowIndex) if (headerRow == null) { throw new IllegalStateException('Sheet has no header row') } Map&lt;String, Integer&gt; headerToIndex = buildHeaderIndex(headerRow, formatter) Integer col1Idx = headerToIndex.get('col1') Integer col2Idx = headerToIndex.get('col2') Integer col3Idx = headerToIndex.get('col3') if (col1Idx == null || col2Idx == null || col3Idx == null) { throw new IllegalStateException("Expected header columns: Col1, Col2, Col3") } int sumColIdx = col3Idx + 1; setCellString(headerRow, sumColIdx, 'SUM') int lastRow = sheet.getLastRowNum() for (int r = headerRowIndex + 1; r &lt;= lastRow; r++) { Row row = sheet.getRow(r) if (row == null) continue double v1 = readNumeric(row.getCell(col1Idx, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL)) double v2 = readNumeric(row.getCell(col2Idx, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL)) double v3 = readNumeric(row.getCell(col3Idx, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL)) double sum = v1 + v2 + v3 Cell sumCell = row.getCell(sumColIdx, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) sumCell.setCellValue(sum) } ByteArrayOutputStream out = new ByteArrayOutputStream(Math.max(body.length, 1024)) workbook.write(out) message.setBody(out.toByteArray()) message.setHeader("CamelFileName", "Book2.xlsx") message.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') return message } finally { if (workbook != null) { workbook.close(); } } } def Map&lt;String, Integer&gt; buildHeaderIndex(Row headerRow, DataFormatter formatter) { Map&lt;String, Integer&gt; result = new HashMap&lt;&gt;() short last = headerRow.getLastCellNum() if (last &lt; 0) return result for (int c = 0; c &lt; last; c++) { Cell cell = headerRow.getCell(c, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL) if (cell == null) continue String name = formatter.formatCellValue(cell) if (name == null) continue name = name.trim().toLowerCase() if (!name) continue result.put(name, c) } return result } def void setCellString(Row row, int colIdx, String value) { Cell cell = row.getCell(colIdx, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) cell.setCellValue(value) } def double readNumeric(Cell cell) { if (cell == null) return 0d return cell.getNumericCellValue() }</code></pre><P>Once the additional data is added to the worksheet, last step is to write back the file in the S3 bucket using AWS receiver adapter with write operations. The connection properties remain same as before. The processing properties are updated as shown in the below image<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="s3_write.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/392779i5625F5D09397252A/image-size/large?v=v2&amp;px=999" role="button" title="s3_write.png" alt="s3_write.png" /></span></P><P class="lia-align-center" style="text-align: center;">&nbsp;Figure 5: AWS S3 Write File</P><P class="lia-align-left" style="text-align : left;">Once you deploy the integration flow and completes successfully, you should see a new file in your S3 bucket.</P><P class="lia-align-left" style="text-align : left;">Download the file from S3 on your local using below command</P><pre class="lia-code-sample language-bash"><code>aws s3 cp "s3://&lt;S3-bucket-name&gt;/inbound/Book2.xlsx" "/Users/&lt;Directory&gt;/Desktop/Book2.xlsx"</code></pre><P>You should see a fourth column "SUM" as shown below</P><TABLE border="0" width="348" cellspacing="0" cellpadding="0"><COLGROUP><COL width="87" /></COLGROUP><TBODY><TR><TD width="87" height="21">Col1</TD><TD width="87">Col2</TD><TD width="87">Col3</TD><TD width="87">SUM</TD></TR><TR><TD height="21">1</TD><TD>2</TD><TD>3</TD><TD>6</TD></TR><TR><TD height="21">4</TD><TD>5</TD><TD>6</TD><TD>15</TD></TR><TR><TD height="21">7</TD><TD>8</TD><TD>9</TD><TD>24</TD></TR></TBODY></TABLE><H2 id="toc-hId-172503757">Important Considerations</H2><P>This approach works well in a controlled environment with smaller dataset, there are few important points worth keeping in mind</P><OL><LI><STRONG>Use compatible JAR versions:</STRONG> Open source libraries should be compatible with the JAVA runtime.</LI><LI><STRONG>Keep an eye on security vulnerabilities: </STRONG>Open source libraries might come with some security vulnerabilities.</LI><LI><STRONG>Plan for upgrades carefully: </STRONG>Test your integrations thoroughly if you upgrade the JAR files or if there is platform upgrades.&nbsp;</LI><LI><STRONG>Be cautious with large files:&nbsp;</STRONG>Since the workbook is processed in memory, there is a possibility of higher memory consumption and potential out-of-memory situations for large datasets. In such cases, it is better to split the file in smaller sizes and then process it.</LI><LI><STRONG>Exception Handling:&nbsp;</STRONG>Ensure robust exception handling and alerting during development.</LI></OL><H2 id="toc-hId--24009748">Wrap-Up</H2><P>At this point, we have looked at:</P><OL><LI>Provisioning and using Amazon S3 for the integration scenario</LI><LI>Performing basic S3 operations through AWS CLI</LI><LI>Connecting SAP Cloud Integration to Amazon S3 using the AmazonWebServices adapter</LI><LI>Integrating external open-source libraries such as Apache POI into Cloud Integration</LI><LI>Using Groovy and Apache POI to enrich an Excel workbook and write the updated file back to S3</LI></OL><P>This exercise was a practical way to explore how SAP Cloud Integration can handle document-level processing in addition to file movement. While the example itself was intentionally simple, the pattern opens up interesting possibilities for data enrichment scenarios within the integration layer.</P><P><SPAN><STRONG>Disclaimer</STRONG>: This is not an official reference application or documentation. The thoughts outlined in this blog are based on my real world experience and learnings.</SPAN></P><P class=""><STRONG><EM>Feel free to “like“, “Share“, “Add a Comment” and to get more updates about my next blogs follow me!</EM></STRONG></P><H2 id="toc-hId--220523253"><STRONG><EM>References</EM></STRONG></H2><OL><LI><EM><A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/amazonwebservices-receiver-adapter" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/cloud-integration/sap-cloud-integration/amazonwebservices-receiver-adapter</A>&nbsp;</EM></LI><LI><EM><A href="https://api.sap.com/package/AmazonWebServicesAdapter/overview" target="_blank" rel="noopener noreferrer">https://api.sap.com/package/AmazonWebServicesAdapter/overview</A>&nbsp;</EM></LI><LI><EM><A href="https://poi.apache.org/" target="_blank" rel="noopener nofollow noreferrer">https://poi.apache.org/</A>&nbsp;</EM></LI><LI><EM><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/using-script-api-methods-in-groovy-scripts" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/integration-suite/sap-integration-suite/using-script-api-methods-in-groovy-scripts</A>&nbsp;</EM></LI></OL> 2026-04-07T15:48:35.411000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/building-a-cap-app-with-fiori-integration-part-1-environment-amp-hana-cloud/ba-p/14367752 Building a CAP App with Fiori Integration – Part 1: Environment & HANA Cloud Setup 2026-04-08T08:32:43.137000+02:00 SuryaRamesh https://community.sap.com/t5/user/viewprofilepage/user-id/2066090 <P>In this blog series we are going to see how to create a Basic CAPM Application from scratch through BTP Trial Account and Integrate it with Fiori.&nbsp;</P><P>--&gt; The First Part of this series will explain all the Pre-Requisites to be done before creating CAP Application.&nbsp;</P><P>--&gt; Second Part of this series will explain how to create CAP Application and Integrate it with Fiori.</P><P>Cloud Based Applications may look complex from outside but when blocks are perfectly aligned even a beginner can build a powerful CAP application using BAS. Let’s dive in and start arranging those blocks from the ground up.</P><P><STRONG>Tools Required:</STRONG> BAS, HANA Cloud Central</P><P>At end of this series we can able to successfully run a CAP Application in Fiori Generated App and able to create entries in HANA Cloud Central based DB from the Fiori App.&nbsp;</P><P>1.&nbsp; Create a BTP Trial Account/Use existing Global Account for the Development Process. Access to your SubAccount as below from<STRONG> Account Explorer -&gt; SubAccounts.</STRONG>&nbsp;</P><P>2. Now get into Sub Account and Navigate to Instances and Subscriptions as below and then click <STRONG>Create</STRONG> Button.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAPM - 1.png" style="width: 695px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394422i503A0F865DB8FB4D/image-dimensions/695x278?v=v2" width="695" height="278" role="button" title="CAPM - 1.png" alt="CAPM - 1.png" /></span></P><P>3. Under Services tab -&gt;<STRONG> Select SAP HANA Cloud</STRONG> &amp; in Plan select&nbsp;<STRONG>Tools/<STRONG>hana-cloud</STRONG>&nbsp;</STRONG>which makes service compatible for shareable instance.&nbsp;</P><P><STRONG>Note</STRONG>: If SAP HANA Cloud is not showing under services tab then add it from <STRONG>Entitlements-&gt;Add service Plans.</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAPM - 3.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394423i10776F32A3F3581D/image-size/large?v=v2&amp;px=999" role="button" title="CAPM - 3.png" alt="CAPM - 3.png" /></span></P><P>4. After Creation, the SAP HANA Cloud Central tool will be added to subscription as below along with Business Application Studio. Note: Incase if BAS is not added then add that as well from Create Button.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP - 4.png" style="width: 539px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394411iD10E1805DC40107C/image-dimensions/539x181?v=v2" width="539" height="181" role="button" title="CAP - 4.png" alt="CAP - 4.png" /></span></P><P>5. Once the HANA Cloud and BAS set up is done, then navigate to&nbsp;<STRONG>Security-&gt;Users&nbsp;</STRONG>and assign these Roles.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP-5.png" style="width: 655px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394424i35689B92E2C55826/image-dimensions/655x337?v=v2" width="655" height="337" role="button" title="CAP-5.png" alt="CAP-5.png" /></span></P><P><STRONG>Roles Required :</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP-6.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394425i2EB298D7F4D3D160/image-size/large?v=v2&amp;px=999" role="button" title="CAP-6.png" alt="CAP-6.png" /></span></P><P><STRONG>Note:</STRONG> These roles should be assigned to the user and with that HANA Cloud can be accessed.</P><P class="lia-align-left" style="text-align : left;"><EM>Before moving into next point lets have a quick overview on what is SAP HANA Cloud Central and BAS.&nbsp;</EM></P><P class="lia-align-left" style="text-align : left;"><EM>SAP HANA Cloud Central - It manages&nbsp;SAP HANA Cloud instances&nbsp;within the&nbsp;SAP Business Technology Platform (BTP). It acts as a centralized dashboard to create, monitor, and maintain both&nbsp;SAP HANA database&nbsp;instances and&nbsp;Data Lake&nbsp;instances.</EM></P><P class="lia-align-left" style="text-align : left;"><EM>SAP BAS -&nbsp;<STRONG>SAP Business Application Studio</STRONG>&nbsp;is a cloud-based&nbsp;<STRONG>Integrated Development Environment (IDE)</STRONG>&nbsp;designed specifically to build and extend SAP applications.</EM></P><P class="lia-align-left" style="text-align : left;"><EM>Basically SAP HANA Cloud Central helps to manage data through cloud instances and BAS helps in building data. We can decide how the data should look/maintained from BAS.&nbsp;&nbsp;</EM></P><P class="lia-align-left" style="text-align : left;"><EM>Now let's continue with the Pre-Requisites;</EM></P><P class="lia-align-left" style="text-align : left;">6. As a next step, navigate to&nbsp;<STRONG>Cloud Foundry-&gt;Spaces&nbsp;</STRONG>and ensure if space dev is available. If that is not there then create dev space using&nbsp;<STRONG>Create space&nbsp;</STRONG>Button. This<SPAN>&nbsp;</SPAN><STRONG>Space</STRONG>&nbsp;is really important as it<SPAN>&nbsp;acts as a deployment target from CAP where code is deployed and executed.</SPAN></P><P class="lia-align-left" style="text-align : left;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP 7.png" style="width: 687px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394426iCCB886AF1BE67078/image-dimensions/687x271?v=v2" width="687" height="271" role="button" title="CAP 7.png" alt="CAP 7.png" /></span></P><P class="lia-align-left" style="text-align : left;">7. Navigate to HANA Cloud and click on&nbsp;<STRONG>Create Instance.&nbsp;</STRONG>Again, Creation of HANA Cloud Instance is as important as creation of dev space in cloud foundruy. It<SPAN>&nbsp;acts as the&nbsp;</SPAN><STRONG>database-as-a-service (DBaaS)</STRONG><SPAN>&nbsp;where application’s data is permanently stored. HANA Cloud instance also contains <STRONG>HDI Containers</STRONG>&nbsp;which act as a bridge between&nbsp;<STRONG>design-time</STRONG>&nbsp;code from BAS into&nbsp;<STRONG>run-time</STRONG>&nbsp;database objects like tables and views.</SPAN></P><P class="lia-align-left" style="text-align : left;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP 8.png" style="width: 685px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394427i55505F8960F0B8C2/image-dimensions/685x287?v=v2" width="685" height="287" role="button" title="CAP 8.png" alt="CAP 8.png" /></span></P><P class="lia-align-left" style="text-align : left;"><SPAN>8. On&nbsp;<STRONG>Type&nbsp;</STRONG>section select Instance configuration as&nbsp;<STRONG>Configure Manually&nbsp;</STRONG>( Select other options if you want to configure instance in different way ) and Instance type as&nbsp;<STRONG>SAP HANA Database&nbsp;</STRONG>as we are creating Instance for HANA DB. If Data Lake is expected then select Data lake instead of HANA DB.&nbsp;</SPAN></P><P class="lia-align-left" style="text-align : left;"><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP 9.png" style="width: 500px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394382i8B49DB2217DD4009/image-dimensions/500x299?v=v2" width="500" height="299" role="button" title="CAP 9.png" alt="CAP 9.png" /></span></SPAN></P><P class="lia-align-left" style="text-align : left;"><SPAN>9. In section&nbsp;<STRONG>SAP HANA Database General, Cloud foundry </STRONG>tab&nbsp;to be navigated for filling instance related details as the deployment happens for Cloud Foundry. But it is disabled by default. Henceforth user should select&nbsp;<STRONG>Sign in to cloud Foundry Environment&nbsp;</STRONG>and after sign in the Cloud Foundry tab will be enabled. In that tab fill the details as below.&nbsp;</SPAN></P><P class="lia-align-left" style="text-align : left;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP 10.png" style="width: 580px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394430iE7A2EDAF22B89B0D/image-dimensions/580x232?v=v2" width="580" height="232" role="button" title="CAP 10.png" alt="CAP 10.png" /></span></P><P class="lia-align-left" style="text-align : left;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP 11.png" style="width: 547px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394431iC0B370B62174D223/image-dimensions/547x331?v=v2" width="547" height="331" role="button" title="CAP 11.png" alt="CAP 11.png" /></span></P><P class="lia-align-left" style="text-align : left;">10. Post filling the important section as above, navigate to other sections where Connection Details and Advanced settings needs to be mentioned. For a Minimalistic App execution these tabs are not required and henceforth I've skipped it. It needs to be filled based on Business expectations.&nbsp;</P><P class="lia-align-left" style="text-align : left;">11. Enable Data lake if required and click on create instance as below.&nbsp;</P><P class="lia-align-left" style="text-align : left;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP 14.png" style="width: 460px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394395i4D7BFC51961411EF/image-dimensions/460x306?v=v2" width="460" height="306" role="button" title="CAP 14.png" alt="CAP 14.png" /></span></P><P class="lia-align-left" style="text-align : left;">12. Once above process is done, Test Instance will be created for SAP HANA Cloud central as below and it acts as DB for the Developments made from CAP Project.&nbsp;</P><P class="lia-align-left" style="text-align : left;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP 15.png" style="width: 669px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394435i35E85461A06F8A46/image-dimensions/669x344?v=v2" width="669" height="344" role="button" title="CAP 15.png" alt="CAP 15.png" /></span></P><P class="lia-align-left" style="text-align : left;">13. Now SAP HANA Cloud is all set, Let's Navigate to BAS and create Dev Space. Get back to your subaccount. Navigate Instances and Subscriptions -&gt; Business Application Studio. Click on create Dev space.</P><P class="lia-align-left" style="text-align : left;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP 16.png" style="width: 502px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394398iD39BAC75BA7247DD/image-dimensions/502x310?v=v2" width="502" height="310" role="button" title="CAP 16.png" alt="CAP 16.png" /></span></P><P class="lia-align-left" style="text-align : left;">14. Define Dev space name and select Full Stack cloud Application option as below.&nbsp;</P><P class="lia-align-left" style="text-align : left;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP 17.png" style="width: 596px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394436i4B7321DE283A2334/image-dimensions/596x426?v=v2" width="596" height="426" role="button" title="CAP 17.png" alt="CAP 17.png" /></span></P><P class="lia-align-left" style="text-align : left;">15. With that Dev space will be created in BAS.&nbsp;</P><P class="lia-align-left" style="text-align : left;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="CAP 18.png" style="width: 635px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/394437iD6A18649A9E52079/image-dimensions/635x203?v=v2" width="635" height="203" role="button" title="CAP 18.png" alt="CAP 18.png" /></span></P><P class="lia-align-left" style="text-align : left;">From here, let's continue on <STRONG><A href="https://community.sap.com/t5/technology-blog-posts-by-members/build-btp-cap-app-with-fiori-integration-part-2-implementing-end-to-end-app/ba-p/14369248" target="_blank">Part - 2</A>&nbsp;</STRONG>&nbsp;where full stack CAP Application will be built and Deployed/Integrated with SAP HANA Cloud.&nbsp;</P><P class="lia-align-left" style="text-align : left;">What we did till now.</P><P class="lia-align-left" style="text-align : left;">-&gt; Created Trial Account</P><P class="lia-align-left" style="text-align : left;">-&gt; Enabled necessary subscriptions and Roles&nbsp;</P><P class="lia-align-left" style="text-align : left;">-&gt; Set up SAP HANA Cloud Central</P><P class="lia-align-left" style="text-align : left;">-&gt; Created Instance and ensured Dev space is available</P><P class="lia-align-left" style="text-align : left;">-&gt; Set up BAS Dev space.&nbsp;</P><P class="lia-align-left" style="text-align : left;"><STRONG><EM>PART: 2 Link - </EM></STRONG><EM><A href="https://community.sap.com/t5/technology-blog-posts-by-members/build-btp-cap-app-with-fiori-integration-part-2-implementing-end-to-end-app/ba-p/14369248" target="_blank">Build BTP CAP App with Fiori Integration – Part 2: Implementing End to End App</A>&nbsp;</EM></P> 2026-04-08T08:32:43.137000+02:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-cloud-integration-ci-cpi-identify-amp-manage-unused-iflows-integration/ba-p/14370979 SAP Cloud Integration (CI/CPI) - Identify & Manage Unused iFlows (integration flows) 2026-04-10T17:24:28.745000+02:00 adarshrao_rao https://community.sap.com/t5/user/viewprofilepage/user-id/882299 <P>Over time, SAP Cloud Integration (CI/CPI) tenants, especially larger ones tend to accumulate integration flows that are no longer needed. These may include old test flows, integration scenarios tied to decommissioned systems, or temporary interfaces created during projects and never removed.</P><P>Manually identifying such unused integration flows is difficult and time‑consuming. SAP Cloud Integration provides standard APIs that expose deployment status and recent execution history. By combining these APIs, we can build a simple, transparent, and repeatable solution to highlight unused integration flows and optionally clean them up.</P><H2 id="toc-hId-1794087122">Problem Statement</H2><P>Integration teams often face questions such as:</P><UL><LI>Which integration flows are still being used?</LI><LI>Which flows have silently stopped executing?</LI><LI>Which deployed flows can safely be reviewed or removed?</LI></UL><H2 id="toc-hId-1597573617">Solution Overview</H2><P>The solution described in this blog is implemented as a controller integration flow. It uses only standard SAP Cloud Integration APIs and consists of the following steps:</P><OL><LI>Retrieve all currently deployed integration flows</LI><LI>Retrieve message processing logs from the monitoring API</LI><LI>Correlate deployment status with execution evidence</LI><LI>Identify unused integration flows</LI><LI>Generate easy‑readable reports (JSON and CSV)</LI><LI>Optionally undeploy unused integration flows (explicitly controlled)</LI></OL><H2 id="toc-hId-1401060112">What Do We Mean by Unused Integration Flows?</H2><P>Due to SAP CI monitoring retention limits, this solution intentionally uses a clear and conservative definition:</P><P>An unused integration flow is a deployed integration flow that has not shown any execution activity within the available monitoring window and is older than a configurable grace period.</P><P>Rather than making assumptions about long‑term execution history, the solution classifies unused flows based on what the platform can reliably confirm.</P><H2 id="toc-hId-1204546607">Distinction Between Inactive and No Message Processing Logs</H2><P>When the inactivity threshold is configured to a value lower than the monitoring retention window (for example, 14 days), the solution can provide additional insight:</P><P>Inactive Integration Flows:</P><UL><LI>Execution logs exist</LI><LI>The flow executed previously but not within the last N days (eg: 14 days)</LI></UL><P>No Message Processing Logs:</P><UL><LI>No execution records exist within the monitoring window</LI><LI>This may indicate that the flow never executed recently or that any execution happened outside the retention period (30 days)</LI></UL><P>When the inactivity threshold is equal to or greater than the monitoring retention period, both cases are safely grouped under a single concept: <STRONG>unused integration flows.</STRONG></P><H2 id="toc-hId-1008033102">High-Level Architecture</H2><P>The controller integration flow is structured into modular steps:</P><UL><LI>Retrieve deployed integration flows</LI><LI>Retrieve message processing logs</LI><LI>Build an execution map</LI><LI>Detect unused integration flows</LI><LI>Generate reports</LI><LI>Optional undeploy branch</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="unused_archi.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396155iA7BA8FAA30165791/image-size/large?v=v2&amp;px=999" role="button" title="unused_archi.png" alt="unused_archi.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="unused_new.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396145iA0158D0DDE2D4A59/image-size/large?v=v2&amp;px=999" role="button" title="unused_new.png" alt="unused_new.png" /></span></P><P><FONT color="#FF00FF"><STRONG>Update:&nbsp;</STRONG>Flow is updated in order to account pagination while extracting messages from Message processing logs API due to default 1000 messages/ extraction by the API</FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_4-1775868050996.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396255iF370AD9C828A39EA/image-size/large?v=v2&amp;px=999" role="button" title="adarshrao_rao_4-1775868050996.png" alt="adarshrao_rao_4-1775868050996.png" /></span></P><P>This modular design keeps the logic easy to understand, test, and extend.</P><H2 id="toc-hId-811519597">Scripts Used in the Integration Flow</H2><P><FONT color="#0000FF"><STRONG>extractDeployedIflows</STRONG></FONT></P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message import groovy.json.JsonSlurper def Message processData(Message message) { def body = message.getBody(String) def json = new JsonSlurper().parseText(body) if (!json?.d?.results) { throw new RuntimeException("Invalid response from IntegrationRuntimeArtifacts API") } def deployedIflows = [] json.d.results.each { r -&gt; // Only Integration Flows if (r.Type == "INTEGRATION_FLOW") { // Consider active runtime states only if (r.Status in ["STARTED", "STARTING"]) { deployedIflows &lt;&lt; [ id : r.Id, name : r.Name, version : r.Version, status : r.Status, deployedOn : r.DeployedOn, deployedBy : r.DeployedBy ] } } } message.setProperty("DEPLOYED_IFLOWS", deployedIflows) message.setProperty("DEPLOYED_COUNT", deployedIflows.size()) return message }</code></pre><P>This script parses the Integration Runtime Artifacts API response and collects all deployed integration flows along with metadata such as deployment timestamp.</P><P><FONT color="#FF00FF"><STRONG>Update:</STRONG></FONT></P><P><FONT color="#FF00FF"><STRONG>Instead of the below script "buildExecutionMapFromLogs", please use "buildExecutionMapFromLogsPaged"</STRONG></FONT></P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message import groovy.util.XmlSlurper def Message processData(Message message) { def xmlText = message.getBody(String) def xml = new XmlSlurper(false, false).parseText(xmlText) // Get or initialize execution map safely def executionMap = message.getProperty("EXECUTION_MAP") if (!(executionMap instanceof Map)) { executionMap = [:] } int entryCount = 0 xml.entry.each { entry -&gt; entryCount++ def props = entry.content."m:properties" if (!props) { return } def iflowName = props."d:IntegrationFlowName"?.text() def logStart = props."d:LogStart"?.text() if (iflowName &amp;&amp; logStart) { def existing = executionMap[iflowName] if (!existing || logStart &gt; existing) { executionMap[iflowName] = logStart } } } // Save merged execution map message.setProperty("EXECUTION_MAP", executionMap) // Pagination control def pageSize = (message.getProperty("LOG_PAGE_SIZE") ?: "1000") as Integer def skip = (message.getProperty("LOG_SKIP") ?: "0") as Integer if (entryCount &lt; pageSize) { // Last page reached message.setProperty("HAS_MORE_LOGS", false) } else { // More pages available message.setProperty("LOG_SKIP", skip + pageSize) message.setProperty("HAS_MORE_LOGS", true) } return message }</code></pre><P>&nbsp;</P><P><STRIKE><FONT color="#0000FF"><STRONG>buildExecutionMapFromLogs</STRONG></FONT></STRIKE></P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message import groovy.util.XmlSlurper def Message processData(Message message) { def xmlText = message.getBody(String) def xml = new XmlSlurper(false, false).parseText(xmlText) /* Map: IntegrationFlowName -&gt; Latest LogStart */ def executionMap = [:] xml.entry.each { entry -&gt; // CPI-safe namespace access def props = entry.content."m:properties" if (!props) { return } def iflowName = props."d:IntegrationFlowName"?.text() def logStart = props."d:LogStart"?.text() if (iflowName &amp;&amp; logStart) { def existing = executionMap[iflowName] // Keep only the latest timestamp if (!existing || logStart &gt; existing) { executionMap[iflowName] = logStart } } } message.setProperty("EXECUTION_MAP", executionMap) message.setProperty("EXECUTION_COUNT", executionMap.size()) return message }</code></pre><P><STRIKE>This script parses the Message Processing Logs response and builds a map that links each integration flow ID to its most recent execution timestamp found in monitoring.</STRIKE></P><P><FONT color="#0000FF"><STRONG>detectUnusedIflows</STRONG></FONT></P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message import java.time.LocalDateTime import java.time.temporal.ChronoUnit def Message processData(Message message) { def deployed = message.getProperty("DEPLOYED_IFLOWS") def execMap = message.getProperty("EXECUTION_MAP") def days = message.getProperty("INACTIVITY_DAYS") as Integer if (!deployed || execMap == null || days == null) { throw new RuntimeException( "Missing required properties: " + "DEPLOYED_IFLOWS=${deployed != null}, " + "EXECUTION_MAP=${execMap != null}, " + "INACTIVITY_DAYS=${days != null}" ) } def now = LocalDateTime.now() def inactiveIflows = [] deployed.each { i -&gt; def deployedOn = LocalDateTime.parse(i.deployedOn) // Grace period: skip newly deployed flows def deployedDaysAgo = ChronoUnit.DAYS.between(deployedOn, now) if (deployedDaysAgo &lt; days) { return } def lastRun = execMap[i.id] if (lastRun) { // Execution exists in monitoring def last = LocalDateTime.parse(lastRun) def inactiveDays = ChronoUnit.DAYS.between(last, now) if (inactiveDays &gt;= days) { inactiveIflows &lt;&lt; [ id : i.id, name : i.name, deployedOn : i.deployedOn, lastExecution : lastRun, inactiveDays : inactiveDays, reason : "INACTIVE" ] } } else { // No execution detected in monitoring inactiveIflows &lt;&lt; [ id : i.id, name : i.name, deployedOn : i.deployedOn, lastExecution : null, inactiveDays : deployedDaysAgo, reason : "NO_MONITORING_LOGS" ] } } message.setProperty("UNUSED_IFLOWS", inactiveIflows) message.setProperty("UNUSED_COUNT", inactiveIflows.size()) return message }</code></pre><P>This script compares deployed integration flows with available execution data. It applies a grace period and identifies which flows can be considered unused.</P><P><FONT color="#0000FF"><STRONG>generateJsonAndCsvReport</STRONG></FONT></P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message import groovy.json.JsonOutput import java.time.LocalDateTime def Message processData(Message message) { def unused = message.getProperty("UNUSED_IFLOWS") ?: [] def days = message.getProperty("INACTIVITY_DAYS") // -------- JSON Report -------- def report = [ scanTimestamp : LocalDateTime.now().toString(), inactivityDays : days, unusedCount : unused.size(), unusedIflows : unused ] def reportJson = JsonOutput.prettyPrint(JsonOutput.toJson(report)) // Set JSON as response body message.setBody(reportJson) message.setHeader("Content-Type", "application/json") // -------- CSV Report -------- def csvLines = [] csvLines &lt;&lt; "Id,Name,DeployedOn,LastExecution,InactiveDays,Reason" unused.each { u -&gt; csvLines &lt;&lt; [ u.id, u.name ?: "", u.deployedOn ?: "", u.lastExecution ?: "", u.inactiveDays != null ? u.inactiveDays.toString() : "", u.reason ?: "" ].join(",") } def reportCsv = csvLines.join("\n") // -------- MPL Attachments -------- def messageLog = messageLogFactory.getMessageLog(message) if (messageLog != null) { // JSON attachment messageLog.addAttachmentAsString( "Unused_Integration_Flow_Report.json", reportJson, "application/json" ) // CSV attachment messageLog.addAttachmentAsString( "Unused_Integration_Flow_Report.csv", reportCsv, "text/csv" ) } return message }</code></pre><P>This script produces a JSON and a CSV report containing all unused integration flows. Both reports are attached to the Message Processing Log for auditing and review.</P><P><FONT color="#FF00FF">Update:</FONT></P><P><FONT color="#FF00FF">buildPagingQuery - This script is used to build CamelHTTPQueryHeader which is used to inject for Pagination</FONT></P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message def Message processData(Message message) { def top = message.getProperty("LOG_PAGE_SIZE") ?: 1000 def skip = message.getProperty("LOG_SKIP") ?: 0 // Build OData pagination query message.setHeader( "CamelHttpQuery", "\$top=${top}&amp;\$skip=${skip}" ) return message }</code></pre><P><FONT color="#FF00FF">countExecutionMap - This script is used to get the get the count in EXECUTION_MAP</FONT></P><pre class="lia-code-sample language-java"><code>import com.sap.gateway.ip.core.customdev.util.Message def Message processData(Message message) { def execMap = message.getProperty("EXECUTION_MAP") int count = (execMap instanceof Map) ? execMap.size() : 0 message.setProperty("EXECUTION_MAP_COUNT", count) // Optional: log for visibility def log = messageLogFactory.getMessageLog(message) if (log != null) { log.addCustomHeaderProperty( "ExecutionMapCount", count.toString() ) } return message }</code></pre><H2 id="toc-hId-615006092">Integration Flow Steps:</H2><P><SPAN>For Integration Content API Reference, please refer this&nbsp;</SPAN><A href="https://api.sap.com/api/IntegrationContent/resource/Integration_Package_Discover" target="_self" rel="noopener noreferrer">link</A></P><P>1. Setting the inactivity days property to explicity specify if you want to add a grace period Eg: 10 days or 14 days apart from the standard 30 days retention. Setting a property to automatically undeploy the unused flows&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_1-1775832794378.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396158i6753272C8EB26F0E/image-size/large?v=v2&amp;px=999" role="button" title="adarshrao_rao_1-1775832794378.png" alt="adarshrao_rao_1-1775832794378.png" /></span></P><P>2. Call the API&nbsp;<STRONG>/api/v1/IntegrationRuntimeArtifacts&nbsp;</STRONG>to get all the deployed integration flows in the tenant</P><P>3. Use the script&nbsp;<STRONG><FONT color="#000000">extractDeployedIflows</FONT></STRONG></P><P><FONT color="#FF00FF"><STRONG>Update:</STRONG></FONT></P><P><FONT color="#FF00FF">4. Use content modifer "Set - Properties for Pagination" to set the properties needed for pagination</FONT></P><P><FONT color="#FF00FF"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_0-1775868664034.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396256iD4434A29B56BA23C/image-size/large?v=v2&amp;px=999" role="button" title="adarshrao_rao_0-1775868664034.png" alt="adarshrao_rao_0-1775868664034.png" /></span></FONT></P><P><FONT color="#FF00FF">5. Add a Looping process Call "Get - Message Processing Logs"</FONT></P><P><FONT color="#FF00FF"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_1-1775868713222.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396257iB5D97B2EB4FAEA2D/image-size/large?v=v2&amp;px=999" role="button" title="adarshrao_rao_1-1775868713222.png" alt="adarshrao_rao_1-1775868713222.png" /></span></FONT></P><P><FONT color="#FF00FF">6. Use the script&nbsp;<STRONG>buildPagingQuery</STRONG></FONT></P><P><FONT color="#FF00FF">7. Call the API&nbsp;<STRONG>/api/v1/MessageProcessingLogs&nbsp;</STRONG>to get all the message logs in the tenant</FONT></P><P><FONT color="#FF00FF">8. Use the script&nbsp;<STRONG>buildExecutionMapFromLogsPaged</STRONG></FONT></P><P><FONT color="#FF00FF">9. Use the script<STRONG>countExecutionMap</STRONG></FONT></P><P><STRIKE><FONT color="#000000">5. Use the script&nbsp;<STRONG>buildExecutionMapFromLogs</STRONG></FONT></STRIKE></P><P><FONT color="#000000">10. Use the script&nbsp;<STRONG>detectUnusedIflows</STRONG></FONT></P><P><FONT color="#000000">11. Use the script <STRONG>generateJson&amp;CsvReport</STRONG></FONT></P><P><FONT color="#000000">12. If the undeploy unused iflows needs to be automated then use a router as below</FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_0-1775833440032.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396166i177A47FD63E7F537/image-size/large?v=v2&amp;px=999" role="button" title="adarshrao_rao_0-1775833440032.png" alt="adarshrao_rao_0-1775833440032.png" /></span></P><P>13. Since we need to provide iflow ids one by one to API, we need to use a General Splitter. General Splitter works well if the format is in xml. Hence, I have used a standard JSON to XML converter</P><P>14. In the General Splitter, I have set the XPATH expression as below</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_0-1775833691851.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396173iC8B6FC632DA56701/image-size/medium?v=v2&amp;px=400" role="button" title="adarshrao_rao_0-1775833691851.png" alt="adarshrao_rao_0-1775833691851.png" /></span></P><P>15. Set iflow id property as below</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_1-1775833801377.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396179i7390DD6AE3C22708/image-size/large?v=v2&amp;px=999" role="button" title="adarshrao_rao_1-1775833801377.png" alt="adarshrao_rao_1-1775833801377.png" /></span></P><P>16. Call&nbsp;<STRONG>/api/v1/IntegrationRuntimeArtifacts('${property.id}')&nbsp;</STRONG>with DELETE operation</P><P>JSON Report:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_2-1775834003671.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396180iDEE90453DE3A6D16/image-size/large?v=v2&amp;px=999" role="button" title="adarshrao_rao_2-1775834003671.png" alt="adarshrao_rao_2-1775834003671.png" /></span></P><P>CSV Report:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="adarshrao_rao_3-1775834110281.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396181iE0E11B899F073CD6/image-size/large?v=v2&amp;px=999" role="button" title="adarshrao_rao_3-1775834110281.png" alt="adarshrao_rao_3-1775834110281.png" /></span></P><H2 id="toc-hId-418492587">How to Use the Results</H2><P>In Non‑Production Systems:</P><UL><LI>Clean up abandoned test integration flows</LI><LI>Reduce tenant clutter</LI><LI>Improve troubleshooting efficiency</LI></UL><P>In Production Systems:</P><UL><LI>Identify candidates for review</LI><LI>Support governance and lifecycle discussions</LI><LI>Optionally undeploy flows with explicit control</LI></UL><H2 id="toc-hId-221979082">Limitations and Transparency</H2><P>This solution respects SAP Cloud Integration monitoring retention limits. It does not attempt to infer execution history beyond what the platform provides. For long‑term historical analysis, execution timestamps would need to be stored externally.</P><H2 id="toc-hId-25465577">Conclusion</H2><P>By combining deployment information with recent execution evidence, this solution provides a practical and transparent way to manage unused integration flows in SAP Cloud Integration.</P><P>It delivers immediate value in non‑production systems and meaningful governance insights in production, all while relying solely on standard CPI capabilities.</P><DIV class=""><DIV class=""><DIV class=""><P><SPAN>I invite you to share your thoughts in the comments below. It helps others who are navigating similar journeys and contributes to a community of shared knowledge. I look forward to hearing from you!</SPAN></P></DIV></DIV></DIV> 2026-04-10T17:24:28.745000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/event-driven-integration-simplified-why-salesforce-pub-sub-adapter-is-the/ba-p/14372483 Event-Driven Integration Simplified: Why Salesforce Pub/Sub Adapter Is the Right Choice in SAP CI 2026-04-13T12:55:27.854000+02:00 Punith_Oswal https://community.sap.com/t5/user/viewprofilepage/user-id/148179 <H3 id="toc-hId-1923224643"><STRONG><SPAN>Introduction</SPAN></STRONG><SPAN>&nbsp;</SPAN></H3><P><SPAN>If you are building integrations between Salesforce and SAP using SAP Cloud Integration (SAP CI), the&nbsp;</SPAN><STRONG><SPAN>Salesforce Adapter</SPAN></STRONG><SPAN>&nbsp;has&nbsp;likely been&nbsp;your trusted&nbsp;workhorse,&nbsp;and it should remain so. It handles CRUD operations beautifully: querying records with SOQL, creating leads, updating opportunities,&nbsp;upserting&nbsp;accounts with External IDs.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>But here is the question this blog is really asking:&nbsp;</SPAN><STRONG><SPAN>when your integration need is event-driven, are you using the right tool?</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><P><SPAN>Many customers today subscribe to Salesforce Platform Events or Change Data Capture (CDC) events through the Salesforce Adapter's Streaming API capability. It works,&nbsp;but it relies on the&nbsp;</SPAN><STRONG><SPAN>CometD&nbsp;protocol</SPAN></STRONG><SPAN>, a technology that was designed for a different era of web communication. SAP CI now offers a dedicated&nbsp;</SPAN><STRONG><SPAN>Salesforce Pub/Sub Adapter</SPAN></STRONG><SPAN>, built on the modern&nbsp;</SPAN><STRONG><SPAN>gRPC&nbsp;protocol</SPAN></STRONG><SPAN>, that is a significantly better fit for event-based integration.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>This blog is not about replacing the Salesforce Adapter. It is about using the right adapter for the right job. For CRUD operations, keep using the Salesforce Adapter. For events, it is time to move to the Pub/Sub Adapter.</SPAN><SPAN>&nbsp;</SPAN></P><H3 id="toc-hId-1726711138"><STRONG><SPAN>The Salesforce Adapter:&nbsp;</SPAN></STRONG><SPAN>&nbsp;</SPAN></H3><P><SPAN>The Salesforce Adapter in SAP CI is a full-featured integration adapter that supports:</SPAN><SPAN>&nbsp;</SPAN></P><UL><LI><STRONG><SPAN>REST&nbsp;API</SPAN></STRONG><SPAN>&nbsp;:&nbsp;Standard CRUD operations on Salesforce objects</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><STRONG><SPAN>REST API&nbsp;Composite</SPAN></STRONG><SPAN>&nbsp;:&nbsp;Batch multiple operations in a single call</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><STRONG><SPAN>Bulk&nbsp;API</SPAN></STRONG><SPAN>&nbsp;:&nbsp;High-volume data loads</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><STRONG><SPAN>APEX&nbsp;REST</SPAN></STRONG><SPAN>&nbsp;:&nbsp;Invoke custom server-side Salesforce logic</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><STRONG><SPAN>Streaming&nbsp;API</SPAN></STRONG><SPAN>&nbsp;:&nbsp;Subscribe to real-time event channels</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><SPAN>That last capability&nbsp;“Streaming API”&nbsp;is where things get interesting. The Salesforce Adapter does support event-based communication, and many customers are using it today for Platform Events and&nbsp;PushTopics. This is not a broken integration. It works.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>However, underneath the Streaming API is the&nbsp;</SPAN><STRONG><SPAN>CometD&nbsp;protocol</SPAN></STRONG><SPAN>,&nbsp;CometD&nbsp;is&nbsp;an open-source messaging bus that implements&nbsp;the&nbsp;</SPAN><STRONG><SPAN>Bayeux protocol (</SPAN></STRONG><SPAN>a&nbsp;specification&nbsp;for&nbsp;server-push communication over HTTP). Salesforce's Streaming API is built on top of&nbsp;CometD.</SPAN></P><H3 id="toc-hId-1530197633"><STRONG><SPAN>The Pub/Sub Adapter: Built for Events from the Ground Up</SPAN></STRONG><SPAN>&nbsp;</SPAN></H3><P><SPAN>SAP CI's&nbsp;</SPAN><STRONG><SPAN>Salesforce Pub/Sub Sender Adapter</SPAN></STRONG><SPAN>&nbsp;takes a fundamentally different approach. Instead of the Streaming API's&nbsp;CometD&nbsp;layer, it uses Salesforce's&nbsp;</SPAN><STRONG><SPAN>Pub/Sub API</SPAN></STRONG><SPAN>, which is built on&nbsp;</SPAN><STRONG><SPAN>gRPC&nbsp;over HTTP/2</SPAN></STRONG><SPAN>.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>This is not just a protocol&nbsp;swap,&nbsp;it is a rethinking of how event subscriptions should work in an enterprise integration context.</SPAN><SPAN>&nbsp;</SPAN></P><P><STRONG><SPAN>The&nbsp;difference&nbsp;gRPC&nbsp;protocol brings:</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><P><SPAN>gRPC&nbsp;is a modern, high-performance Remote Procedure Call framework developed by Google. It&nbsp;operates&nbsp;over&nbsp;</SPAN><STRONG><SPAN>HTTP/2</SPAN></STRONG><SPAN>, which enables:</SPAN><SPAN>&nbsp;</SPAN></P><UL><LI><STRONG><SPAN>Persistent bidirectional&nbsp;streams</SPAN></STRONG><SPAN>&nbsp;:&nbsp;a single connection stays open and allows messages to flow in both directions simultaneously, without the need for repeated handshakes</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><STRONG><SPAN>Binary serialisation with Protocol Buffers (protobuf)</SPAN></STRONG><SPAN>&nbsp;:&nbsp;event payloads are compact and efficient, making&nbsp;gRPC&nbsp;approximately&nbsp;</SPAN><STRONG><SPAN>7–10x faster than REST</SPAN></STRONG><SPAN>&nbsp;in payload processing</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><STRONG><SPAN>Multiplexing&nbsp;and Low&nbsp;Latency</SPAN></STRONG><SPAN>&nbsp;:&nbsp;multiple streams over a single connection, with no head-of-line blocking&nbsp;</SPAN><SPAN>and binary message serialization through Protocol Buffers, resulting in lower latency and faster data delivery.</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><STRONG><SPAN>Native flow&nbsp;control</SPAN></STRONG><SPAN>&nbsp;:&nbsp;built into the HTTP/2 layer, giving both sides control over how much data is in flight</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><SPAN>In practical terms: where&nbsp;CometD&nbsp;is a series of HTTP/1.1 conversations imitating a stream,&nbsp;gRPC&nbsp;is a&nbsp;</SPAN><STRONG><SPAN>genuine, persistent, bidirectional channel</SPAN></STRONG><SPAN>.</SPAN><SPAN>&nbsp;</SPAN></P><H3 id="toc-hId-1333684128"><SPAN><SPAN class=""><SPAN class="">A Side-by-Side Comparison: Streaming API (</SPAN><SPAN class="">CometD</SPAN><SPAN class="">) vs Pub/Sub API (</SPAN><SPAN class="">gRPC</SPAN><SPAN class="">)</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></H3><TABLE><TBODY><TR><TD><P><STRONG><SPAN>Capability</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><STRONG><SPAN>Streaming API via Salesforce Adapter</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><STRONG><SPAN>Pub/Sub API via Pub/Sub Adapter</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>Underlying Protocol</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>CometD&nbsp;/ Bayeux over HTTP/1.1</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>gRPC&nbsp;over HTTP/2</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>Connection Type</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Long-polling (simulated stream)</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Genuine persistent bidirectional stream</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>Flow Control</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>None&nbsp;:&nbsp;server pushes at its own pace</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Pull-based&nbsp;:&nbsp;client controls event intake</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>Payload Format</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>JSON&nbsp;or XML</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Binary (Apache Avro /&nbsp;Protobuf)</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>Performance</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Moderate</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>High ~7–10x faster payload processing</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>Invalid&nbsp;ReplayID&nbsp;Support&nbsp;&nbsp;</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Not available&nbsp;</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Available ,&nbsp;Latest and Earliest events</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>Duplicate Handling</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Manual implementation needed</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Built into the SAP CI adapter</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>Authentication</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>OAuth 2.0&nbsp;and&nbsp;OAuth 2.0 JWT</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>OAuth 2.0&nbsp;and&nbsp;OAuth 2.0 JWT</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>Event Types Supported</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Platform Events,&nbsp;PushTopics, CDC</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Platform Events, CDC, Event Monitoring</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR></TBODY></TABLE><H3 id="toc-hId-1137170623"><SPAN>&nbsp;</SPAN></H3><H3 id="toc-hId-940657118"><SPAN class=""><SPAN class="">The Right Adapter for the Right Job</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></H3><P><SPAN>Here is how to think about it:</SPAN><SPAN>&nbsp;</SPAN></P><TABLE><TBODY><TR><TD><P><STRONG><SPAN>Integration Need</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><STRONG><SPAN>Recommended Adapter</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Query Salesforce records (SOQL)</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>&nbsp;Salesforce Adapter</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Create or update Salesforce records</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>&nbsp;Salesforce Adapter</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Upsert&nbsp;with External ID</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>&nbsp;Salesforce Adapter</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Bulk data load</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>&nbsp;Salesforce Adapter (Bulk API)</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Subscribe to Platform Events in real time</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>&nbsp;Salesforce Pub/Sub Adapter</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Subscribe to Change Data Capture events</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>&nbsp;Salesforce Pub/Sub Adapter</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Subscribe to Event Monitoring events</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>&nbsp;Salesforce Pub/Sub Adapter</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Publish events&nbsp;</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>&nbsp;Salesforce Pub/Sub&nbsp;Adapter</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR></TBODY></TABLE><P><SPAN class=""><SPAN class=""><SPAN class="">Think of them as complementary adapters<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">operating</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>in different lanes. In a sophisticated Salesforce–SAP integration landscape, you will<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">likely use</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN></SPAN></SPAN><SPAN class=""><SPAN class="">both</SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN>&nbsp;</SPAN>the Salesforce Adapter handling your data operations, and the Pub/Sub Adapter handling your event subscriptions.</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></P><H3 id="toc-hId-744143613"><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Migration Considerations</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></H3><P><STRONG><SPAN>The&nbsp;perception&nbsp;vs.&nbsp;The reality</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><P><SPAN>One of the most common reactions when consultants first propose this migration is concern about scope. The assumption is that moving to a new event protocol means coordinating with the Salesforce team, changing Platform Event&nbsp;definitions&nbsp;and managing a coordinated cutover. It feels like a project that needs multiple teams and a change freeze window.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>That concern is understandable,&nbsp;but it is not&nbsp;accurate.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>There are&nbsp;</SPAN><STRONG><SPAN>zero changes&nbsp;required&nbsp;on the Salesforce side</SPAN></STRONG><SPAN>. Your Platform Event definitions stay exactly as they are.&nbsp;The&nbsp;CDC configuration stays exactly as it is.&nbsp;</SPAN><STRONG><SPAN>The Pub/Sub Adapter is just a new subscriber, using a different transport underneath.</SPAN></STRONG><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>The Salesforce team does not need to be involved at all.&nbsp;The configuration experience in SAP CI also&nbsp;remains&nbsp;largely familiar. The Salesforce Pub/Sub Adapter shares most of its configuration fields with the standard Salesforce Adapter, with only a few&nbsp;additional&nbsp;parameters introduced specifically for event-driven communication.&nbsp;</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>In the section below, we will focus only on these new fields, their configuration, and their significance.</SPAN><SPAN>&nbsp;</SPAN></P><P><STRONG>Step&nbsp;1 :&nbsp;Adapter Configuration:&nbsp;</STRONG></P><P><SPAN>In SAP CI, create a new&nbsp;</SPAN><STRONG><SPAN>Integration Flow</SPAN></STRONG><SPAN>&nbsp;in your package. Add a&nbsp;</SPAN><STRONG><SPAN>Sender</SPAN></STRONG><SPAN>&nbsp;participant, connect it to the Start Message event, and select&nbsp;</SPAN><STRONG><SPAN>Salesforce Pub/Sub</SPAN></STRONG><SPAN>&nbsp;from the adapter dropdown.</SPAN><SPAN>&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_0-1776072202630.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/397020i807B46E32221EC76/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_0-1776072202630.png" alt="Punith_Oswal_0-1776072202630.png" /></span>Connection Tab:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_2-1776072344014.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/397022i24A72A0E881BC82B/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_2-1776072344014.png" alt="Punith_Oswal_2-1776072344014.png" /></span></P><P><SPAN>Parameter Description:</SPAN><SPAN>&nbsp;</SPAN></P><TABLE><TBODY><TR><TD><P><SPAN>Host</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>(New field)</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Specify the host to which the proxy requests are sent for the&nbsp;gRPC&nbsp;API (towards the&nbsp;gRPC&nbsp;host). The proxy requests to the&nbsp;gRPC&nbsp;host will go through the proxy.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>Example: api.pubsub.salesforce.com</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Port</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>(New field)</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Specify the port to which the proxy requests are sent for the&nbsp;gRPC&nbsp;API (towards the&nbsp;gRPC&nbsp;port). The proxy requests to the&nbsp;gRPC&nbsp;port will go through the proxy.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>Example: 7443</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Tenant ID</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>(New field)</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Specify the Salesforce Organization ID, this can be found in Company Information within the "Setup" page on Salesforce</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><SPAN>Authentication</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Select the authentication type to be used for the connection to Salesforce:</SPAN><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>OAuth 2.0 Username-Password</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>OAuth 2.0 JWT Bearer</SPAN><SPAN>&nbsp;</SPAN></LI></UL></TD></TR><TR><TD><P><SPAN>Connection Check Interval (in&nbsp;ms)</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>(New field)</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Specify the interval in milliseconds to verify the connection validity of the&nbsp;gRPC.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>&nbsp;</SPAN></P></TD></TR></TBODY></TABLE><P><SPAN>Processing Tab:</SPAN><SPAN>&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_3-1776072385418.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/397023iBA8B4570D825F5BA/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_3-1776072385418.png" alt="Punith_Oswal_3-1776072385418.png" /></span></P><TABLE border="1" width="100%"><TBODY><TR><TD width="50%"><SPAN class="">Channel<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">Name :</SPAN></TD><TD width="50%">Enter the channel name&nbsp;</TD></TR><TR><TD width="50%"><SPAN class="">Replay ID<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">Approach :</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN></SPAN></TD><TD width="50%"><P><SPAN>Replay ID is the unique ID that is generate for every event, The adapter offers 3 approaches here.</SPAN><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>Events from a Specific Position (Custom):</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>Use this&nbsp;option&nbsp;to listen to events starting from a specific Replay ID. Ideal when you want to resume from a known checkpoint. Once selected, a parameter called Replay ID is enabled where ID can be specified.</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>Events from the Earliest Position (Earliest):</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>This option starts listening from the oldest available event in the event bus at the time of adapter deployment. It captures all events&nbsp;retained&nbsp;in the event bus</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>Events from the Latest Position (Latest):</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>This option starts listening from the latest event&nbsp;at the moment&nbsp;the adapter is deployed. It ignores older events and captures only new incoming ones from that point onward.</SPAN><SPAN>&nbsp;</SPAN></LI></UL></TD></TR><TR><TD width="50%"><SPAN class="">Request Batch Size</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>(New field</SPAN><SPAN class="">)</SPAN></TD><TD width="50%"><SPAN class=""><SPAN class="">Specify the number of events to be requested in the Salesforce<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">fetchRequest</SPAN><SPAN class="">. The Maximum events that Salesforce can return in a single call is 100</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></TD></TR><TR><TD width="50%"><SPAN class="">Replay Preset for Invalid Replay ID</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>(New field</SPAN><SPAN class="">)</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN></SPAN></TD><TD width="50%"><P><SPAN>Select the replay&nbsp;option&nbsp;in case&nbsp;sfdc.platform.eventbus.grpc.subscription.fetch.replayid.corrupted&nbsp;error occurs:</SPAN><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>Events from latest position (Latest)</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>Events from earliest position (Earliest)</SPAN><SPAN>&nbsp;</SPAN></LI></UL></TD></TR><TR><TD width="50%"><SPAN class=""><SPAN class="">Duplicate Check Expiration (in<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">ms</SPAN><SPAN class="">)</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>(New field)</SPAN><SPAN class="">:</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></TD><TD width="50%"><SPAN class=""><SPAN class="">SAP CI<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">operates</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>with two active worker nodes that can simultaneously consume events from Salesforce, which introduces a possibility of duplicate processing. The adapter handles this internally by performing a duplicate check. This parameter defines the<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">expiration</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>time (in milliseconds) for which an event is considered during the duplicate check, helping to prevent redundant processing.</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></TD></TR><TR><TD width="50%"><SPAN class=""><SPAN class="">Process Errors as an Event</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>(New field)<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">:</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;</SPAN><BR /></SPAN></TD><TD width="50%"><SPAN class="">This option is useful for debugging errors occurring on the Salesforce backend. When enabled, errors are streamed as events and ca</SPAN><SPAN class="">n be re</SPAN><SPAN class="">ceived in SAP CI, allowing you to<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">monitor</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>and track issues directly within your integration flow. If disabled, connection or processing errors related to event streams will be logged only in Salesforce, without being sent to SAP CI.</SPAN></TD></TR></TBODY></TABLE><P><STRONG><SPAN class="">Step&nbsp;</SPAN><SPAN class="">2&nbsp;</SPAN><SPAN class="">:</SPAN><SPAN class="">&nbsp;Handle the payload format</SPAN></STRONG></P><P><SPAN class=""><SPAN class=""><SPAN class="">While both adapters&nbsp;</SPAN><SPAN class="">ultimately deliver</SPAN><SPAN class="">&nbsp;the same business information (for example, Platform Events or Change Data Capture events), the way this data is structured and delivered differs slightly.</SPAN></SPAN></SPAN></P><P><STRONG><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Key Differences</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></STRONG></P><UL><LI><STRONG><SPAN>Payload Format:</SPAN></STRONG><UL><LI><SPAN class=""><SPAN class="">Salesforce Adapter delivers payloads directly in&nbsp;</SPAN></SPAN><SPAN class=""><SPAN class="">XML format</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></LI><LI><SPAN class=""><SPAN class=""><SPAN class="">Pub/Sub Adapter delivers payloads in&nbsp;</SPAN></SPAN><SPAN class=""><SPAN class="">Avro (binary)</SPAN></SPAN><SPAN class=""><SPAN class="">, which SAP CI internally deserializes into a&nbsp;</SPAN></SPAN><SPAN class=""><SPAN class="">JSON-like structure</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></LI><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">This requires an&nbsp;</SPAN><SPAN class="">additional&nbsp;</SPAN></SPAN><SPAN class=""><SPAN class="">JSON-to-XML conversion step</SPAN></SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">&nbsp;in the&nbsp;</SPAN><SPAN class="">iFlow</SPAN></SPAN></SPAN></SPAN></LI></UL></LI></UL><UL><LI><STRONG><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Structure &amp; Envelope</SPAN></SPAN><SPAN class=""><SPAN class="">:</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></STRONG><UL><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Salesforce Adapter wraps the payload inside a structured envelope like:</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><UL><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">&lt;</SPAN><SPAN class="">subscribeTopic</SPAN><SPAN class="">&gt; → &lt;data&gt; → &lt;payload&gt; → &lt;event&gt;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI></UL></LI><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Pub/Sub Adapter provides a<SPAN>&nbsp;</SPAN></SPAN></SPAN><SPAN class=""><SPAN class="">flatter and cleaner structure</SPAN></SPAN><SPAN class=""><SPAN class="">, with:&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><UL><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">&lt;payload&gt;</SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN>&nbsp;</SPAN></SPAN><SPAN class="">containing</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>all fields&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Metadata fields like<SPAN>&nbsp;</SPAN></SPAN></SPAN><SPAN class=""><SPAN class="">schemaId</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN></SPAN></SPAN><SPAN class=""><SPAN class="">and<SPAN>&nbsp;</SPAN></SPAN></SPAN><SPAN class=""><SPAN class="">id</SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN>&nbsp;</SPAN>at root level</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI></UL></LI></UL></LI></UL><UL><LI><STRONG><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Field Representation:</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></STRONG><UL><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">In Pub/Sub payloads,&nbsp;</SPAN></SPAN><SPAN class=""><SPAN class="">all fields of the entity are typically present</SPAN></SPAN><SPAN class=""><SPAN class="">, even if empty</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">In Streaming API, the payload is often more<SPAN>&nbsp;</SPAN></SPAN></SPAN><SPAN class=""><SPAN class="">compact and selective</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI></UL></LI></UL><UL><LI><STRONG><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">ChangeEventHeader</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;Node:</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></STRONG><UL><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Present in both formats and&nbsp;</SPAN><SPAN class="">largely&nbsp;</SPAN></SPAN><SPAN class=""><SPAN class="">consistent</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Pub/Sub provides&nbsp;</SPAN><SPAN class="">additional</SPAN><SPAN class="">&nbsp;elements like:&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><UL><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">nulledFields</SPAN><SPAN class="">&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">diffFields</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI></UL></LI><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">This gives more flexibility for advanced event processing</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI></UL></LI></UL><P><STRONG><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Salesforce Adapter (Streaming API) Response:</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_4-1776073116376.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/397032iEEC41B168D5503BB/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_4-1776073116376.png" alt="Punith_Oswal_4-1776073116376.png" /></span></P><P><STRONG><SPAN class=""><SPAN class="">Salesforce Pub Sub Adapter Response:</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_5-1776073154494.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/397033i0AF37B12D8EF35D6/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_5-1776073154494.png" alt="Punith_Oswal_5-1776073154494.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_6-1776073171149.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/397034iCC53F09122573B42/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_6-1776073171149.png" alt="Punith_Oswal_6-1776073171149.png" /></span></P><P><STRONG><SPAN class=""><SPAN class="">Only the following adjustments are needed in SAP CI:</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></STRONG></P><OL><LI><STRONG><SPAN class=""><SPAN class=""><SPAN class="">Add a JSON-to-XML Converter</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></STRONG><OL><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Immediately after the Pub/Sub Sender adapter&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></LI><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">This aligns the payload with your existing XML-based mappings</SPAN></SPAN></SPAN></SPAN></SPAN></LI></OL></LI><LI><STRONG><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Minor Mapping Adjustments (if&nbsp;</SPAN><SPAN class="">required</SPAN><SPAN class="">)</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></STRONG><OL><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Update XPath references if your existing mapping depends on:&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><UL><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Envelope structure (</SPAN></SPAN><SPAN class=""><SPAN class="">/</SPAN><SPAN class="">subscribeTopic</SPAN><SPAN class="">/data/...</SPAN></SPAN><SPAN class=""><SPAN class="">)&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI></UL></LI><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">With Pub/Sub, mapping typically starts directly from&nbsp;</SPAN></SPAN><SPAN class=""><SPAN class="">/root/payload/...</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI></OL></LI><LI><STRONG><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Leverage Additional Metadata (Optional)</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></STRONG><OL><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Fields like&nbsp;</SPAN></SPAN><SPAN class=""><SPAN class="">nulledFields</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;and&nbsp;</SPAN></SPAN><SPAN class=""><SPAN class="">diffFields</SPAN></SPAN><SPAN class=""><SPAN class="">&nbsp;can enhance logic&nbsp;</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI><LI><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Not mandatory for migration, but useful for optimization</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI></OL></LI></OL><P><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">In most cases, existing mappings can be reused with only minor adjustments</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>if<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">required</SPAN><SPAN class="">, as the core business data and<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">ChangeEventHeader</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>structure remain consistent across both adapters.</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P><P><STRONG><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class=""><SPAN class="">Step 3 : Test in parallel, then switch</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></STRONG></P><P><SPAN>This is where the migration story becomes genuinely&nbsp;low-risk. Because the Pub/Sub Adapter is simply an&nbsp;additional&nbsp;subscriber on the same event channel, you can run both your existing Salesforce Adapter&nbsp;iFlow&nbsp;and your new Pub/Sub Adapter&nbsp;iFlow&nbsp;</SPAN><STRONG><SPAN>at the same time</SPAN></STRONG><SPAN>. Salesforce will deliver the event to both consumers independently.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>This means the migration path looks like this:</SPAN><SPAN>&nbsp;</SPAN></P><UL><LI><STRONG><SPAN>Deploy the new Pub/Sub&nbsp;iFlow</SPAN></STRONG><SPAN>&nbsp;alongside the existing Salesforce Adapter&nbsp;iFlow,&nbsp;both consume the same Platform Event or CDC channel</SPAN><SPAN>&nbsp;</SPAN></LI><LI><STRONG><SPAN>Test in parallel</SPAN></STRONG><SPAN>,&nbsp;validate&nbsp;payload processing, replay behaviour, error handling, and downstream integration in the new&nbsp;iFlow&nbsp;while the old one continues running in production</SPAN><SPAN>&nbsp;</SPAN></LI><LI><STRONG><SPAN>Switch over</SPAN></STRONG><SPAN>&nbsp;when you are confident,&nbsp;decommission the old Streaming API&nbsp;iFlow&nbsp;on your own timeline</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><SPAN>There is no big-bang cutover. There is no risk window where your production integration is down. The old&nbsp;iFlow&nbsp;keeps running until you decide to retire it. This is as safe a migration as it gets.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>What stays the same, what changes</SPAN><SPAN>&nbsp;</SPAN></P><TABLE><TBODY><TR><TD><P><SPAN>&nbsp;</SPAN></P></TD><TD><P><STRONG><SPAN>Stays the same</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><STRONG><SPAN>Changes</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>Salesforce side</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Platform Events, Apex triggers, CDC config, channel names</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Nothing</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>SAP CI Auth</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Same Connected App, same credential alias</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Nothing</SPAN><SPAN>&nbsp;</SPAN></P></TD></TR><TR><TD><P><STRONG><SPAN>SAP CI&nbsp;iFlow</SPAN></STRONG><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>Downstream calls, error handling</SPAN><SPAN>&nbsp;</SPAN></P></TD><TD><P><SPAN>New sender adapter, Avro → XML conversion step,&nbsp;</SPAN><SPAN>&nbsp;Mapping (Minor changes)</SPAN></P></TD></TR></TBODY></TABLE><P><SPAN>&nbsp;<SPAN class=""><SPAN class="">The Salesforce team does not need a ticket. The project does not need a steering committee. It needs a developer, a new&nbsp;</SPAN><SPAN class="">iFlow</SPAN><SPAN class="">, and a test run.</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></SPAN></P><H3 id="toc-hId-547630108"><STRONG><SPAN>Conclusion</SPAN></STRONG><SPAN>&nbsp;</SPAN></H3><P><SPAN>The Salesforce Adapter’s Streaming API capability has served its purpose well. But at its core,&nbsp;CometD&nbsp;remains&nbsp;a long-polling workaround from a pre-HTTP/2 era.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>The Salesforce Pub/Sub Adapter is the modern foundation for event-driven integration in SAP CI, offering better performance, reliability, and control through persistent connections, flow control, and built-in deduplication.</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>Use each tool for what it does best:</SPAN><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>Salesforce Adapter for CRUD, bulk operations, and queries&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>Pub/Sub Adapter for real-time, event-driven integration&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><SPAN>The tools&nbsp;are already in your hands.&nbsp;Now&nbsp;it’s&nbsp;about using them the right way.</SPAN><SPAN>&nbsp;</SPAN></P><P><STRONG><SPAN>References</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/configure-salesforce-pub-sub-sender-adapter" target="_blank" rel="noopener noreferrer"><SPAN>SAP Help: Configure Salesforce Pub/Sub Sender Adapter</SPAN></A><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><A title="Real-Time Salesforce Integration with SAP CI: Introducing Salesforce Pub/Sub Adapter" href="https://community.sap.com/t5/technology-blog-posts-by-members/real-time-salesforce-integration-with-sap-ci-introducing-salesforce-pub-sub/ba-p/14089312" target="_self">Real-Time Salesforce Integration with SAP CI: Introducing Salesforce Pub/Sub Adapter</A>&nbsp;</LI></UL><UL><LI><A href="https://api.sap.com/package/SalesforcePubSubAdapterforSAPIntegrationSuite/overview" target="_blank" rel="noopener noreferrer"><SPAN>SAP API Business Hub: Salesforce Pub/Sub Adapter Package</SPAN></A><SPAN>&nbsp;</SPAN></LI></UL><P><SPAN>Hope this helps!</SPAN></P><P><SPAN>Cheers,</SPAN></P><P><SPAN>Punith</SPAN></P> 2026-04-13T12:55:27.854000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/end-to-end-b2b-integration-in-sap-cpi-edifact-orders-d96b-to-idoc-using-tpm/ba-p/14369836 End-to-End B2B Integration in SAP CPI: EDIFACT ORDERS (D96B) to IDoc using TPM 2026-04-13T13:33:55.732000+02:00 Rishikasairi https://community.sap.com/t5/user/viewprofilepage/user-id/1940355 <P>In modern B2B integrations, handling EDI messages without hardcoding partner-specific logic is key to building scalable solutions. In this blog, I walk through a real-world scenario where an external trading partner sends a purchase order in <STRONG>EDIFACT ORDERS (D96B)</STRONG> format, which I process in <STRONG>SAP Integration Suite</STRONG> using <STRONG>Trading Partner Management (TPM)</STRONG> and transform into an <STRONG>SAP IDoc (ORDERS05)</STRONG> for backend processing.</P><P>I cover how I define Message Implementation Guidelines (MIGs), configure trading partners, set up agreements, and use the standard TPM runtime to dynamically identify partners, validate messages, and route them correctly. The focus is on building a robust and reusable integration that ensures traceability and aligns with SAP’s recommended B2B architecture</P><P><STRONG>Scenario:</STRONG></P><P>B2B Integration: EDIFACT ORDERS (D96B) → SAP IDoc using TPM</P><P>Direction: External Partner → Internal SAP System<BR />Message Type: EDIFACT ORDERS D96B<BR />Target Format: SAP IDoc (e.g., ORDERS05)</P><P><STRONG>Business Context</STRONG></P><P>An external trading partner sends a purchase order in <STRONG>EDIFACT ORDERS (D96B)</STRONG> format.</P><P>Our responsibility:</P><UL><LI>Identify the correct partner agreement</LI><LI>Validate the message</LI><LI>Transform EDI → IDoc</LI><LI>Route to internal SAP system</LI><LI>Ensure monitoring and traceability</LI></UL><P><STRONG>Create a MIG (Message Implementation Guide) for EDIFACT Message</STRONG></P><P>The EDIFACT message in scope in our implementation is&nbsp;<STRONG>ORDERS D96 B</STRONG>. We will create a MIG for this EDIFACT Message.</P><P>Go to Integration Suite –&gt; Design –&gt; MIGs. Click on ADD</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_0-1775728686390.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395423iD5F406F52D12CD1A/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_0-1775728686390.png" alt="Rishikasairi_0-1775728686390.png" /></span></P><P>Select&nbsp;<STRONG>UN/EDIFACT</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_1-1775728707220.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395424iE26E39249F49ED10/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_1-1775728707220.png" alt="Rishikasairi_1-1775728707220.png" /></span></P><P>Search for&nbsp;<STRONG>ORDERS&nbsp;</STRONG>and Select&nbsp;<STRONG>ORDERS</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_2-1775728773366.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395425iDC073486E05C0330/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_2-1775728773366.png" alt="Rishikasairi_2-1775728773366.png" /></span></P><P>Select&nbsp;<STRONG>D.96B.S3</STRONG>&nbsp;(Corresponding to our EDIFACT Incoming EDI)</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_3-1775728802269.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395426iDE9F9883A2CFE1E2/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_3-1775728802269.png" alt="Rishikasairi_3-1775728802269.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_4-1775728817148.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395428i1E039D2C0540B0FC/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_4-1775728817148.png" alt="Rishikasairi_4-1775728817148.png" /></span></P><P>&nbsp;If we do not have the EDI XML, you can skip this step.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_5-1775728837521.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395429i15774F183F83C702/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_5-1775728837521.png" alt="Rishikasairi_5-1775728837521.png" /></span></P><P>Provide the below details</P><OL><LI>Name:&nbsp;<STRONG>MIG_UN_EDIFACT_ORDERS_D96B</STRONG></LI><LI>Direction: BOTH</LI><LI>Own Business Context: Select Required Business Process Context</LI><LI>Click on&nbsp;<STRONG>Create</STRONG></LI><LI><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_6-1775728866020.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395431i5FDE8A88CBB221AD/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_6-1775728866020.png" alt="Rishikasairi_6-1775728866020.png" /></span><P>&nbsp;</P><OL><LI>If we have your EDI File example, you can also&nbsp;<STRONG>Simulate</STRONG>&nbsp;this and make sure it works.</LI><LI><STRONG>Activate</STRONG>&nbsp;your MIG</LI></OL></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_7-1775728903772.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395433i6A8A79443448783C/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_7-1775728903772.png" alt="Rishikasairi_7-1775728903772.png" /></span></P><P><STRONG>Create a MIG for IDoc</STRONG></P><P>As per our requirement, the IDoc in scope is an ORDERS.ORDERS05&nbsp;IDoc. You can use the Message Implementation Guidelines section to create a MIG for ORDERS.ORDERS05 IDoc</P><P>Select SAP S/4Hana on premise IDOC</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_8-1775729613462.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395441i7037E57AB0B5485A/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_8-1775729613462.png" alt="Rishikasairi_8-1775729613462.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_9-1775729623605.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395442i7EEAF5E0F59EB90E/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_9-1775729623605.png" alt="Rishikasairi_9-1775729623605.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_10-1775729713796.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395443iB619D4E71F31403E/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_10-1775729713796.png" alt="Rishikasairi_10-1775729713796.png" /></span></P><P>Skip sample payload (we are not using xml payload in our case)</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_11-1775729742825.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395444i4A57FB2A12AA950E/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_11-1775729742825.png" alt="Rishikasairi_11-1775729742825.png" /></span></P><P>&nbsp;</P><P>Create And Activate MIG</P><P><STRONG>TPM CONFUGURATION </STRONG></P><P><STRONG>Creating Company profile </STRONG></P><P>Create &gt; Company name &gt; Company short name</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_12-1775729775338.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395445iAE8FE8497ECD83E0/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_12-1775729775338.png" alt="Rishikasairi_12-1775729775338.png" /></span></P><P><STRONG>Create contact details </STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_13-1775729844585.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395447i5FBF297C0C859FD2/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_13-1775729844585.png" alt="Rishikasairi_13-1775729844585.png" /></span></P><P>&nbsp;</P><P><STRONG>Create Identifiers for the company </STRONG></P><P>Two Identifiers required</P><UL><LI>One for ERP – ERPCLNT200</LI><UL><LI>Identification:&nbsp;<STRONG>ERPCLNT200</STRONG></LI><LI>Alias:&nbsp;<STRONG>ERPCLNT200</STRONG></LI><LI>Type System:&nbsp;<STRONG>SAP S/4HANA On Premise IDoc</STRONG></LI><LI>Scheme:&nbsp;<STRONG>N/A</STRONG></LI></UL><LI>One for EDI Identifier –&nbsp;<STRONG>SELF_1234</STRONG></LI><UL><LI>Identification:&nbsp;<STRONG>SELF_1234</STRONG></LI><LI>Alias:&nbsp;<STRONG>SELF_1234</STRONG></LI><LI>Type System: UN/EDIFACT</LI><LI>Scheme: <STRONG>N/A</STRONG></LI></UL></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_14-1775729887181.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395449iC14003DEC2F2C16A/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_14-1775729887181.png" alt="Rishikasairi_14-1775729887181.png" /></span></P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_15-1775729896428.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395450i5B2103664FD1E71C/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_15-1775729896428.png" alt="Rishikasairi_15-1775729896428.png" /></span></P><P><STRONG>Create Systems for Company</STRONG></P><P>These are just display values that you will then see the B2B Monitoring</P><UL><LI>Name:&nbsp;ERP_ECC</LI><LI>Alias:&nbsp;ERP_ECC</LI><LI>Type: Create&nbsp;<EM>New&nbsp;</EM>in this case</LI><UL><LI>Name:&nbsp;ECC</LI><LI>Description:&nbsp;ECC</LI><LI>Deployment Type:&nbsp;OnPremise</LI><LI>Application:&nbsp;SAP ERP</LI></UL><LI>Purpose:&nbsp;Dev</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_16-1775729957715.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395451i78A8333AD2704DB8/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_16-1775729957715.png" alt="Rishikasairi_16-1775729957715.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_17-1775729966622.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395452i94911DA2F5FBEEC3/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_17-1775729966622.png" alt="Rishikasairi_17-1775729966622.png" /></span></P><P><STRONG>Create Type Systems for Company</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_18-1775730192614.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395455iFAA4FE6420CE6F8E/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_18-1775730192614.png" alt="Rishikasairi_18-1775730192614.png" /></span></P><P><STRONG>Create Communication details </STRONG></P><P>Navigate to&nbsp;Systems&nbsp;-&gt;&nbsp;Communications&nbsp;and Click on&nbsp;Create</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_19-1775730218219.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395456i333B06842CA543D9/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_19-1775730218219.png" alt="Rishikasairi_19-1775730218219.png" /></span></P><P>&nbsp;</P><OL><LI>Name:&nbsp;ERP_ECC_IDOC_RECEIVER</LI><LI>Alias:&nbsp;ERP_ECC_IDOC_RECEIVER</LI><LI>Direction:&nbsp;Receiver</LI><LI>Adapter:&nbsp;IDOC</LI><LI>Address:&nbsp;http://<EM>&lt;&lt;erphostname&gt;&gt;</EM>/sap/bc/srt/idoc?sap-client=<EM>&lt;&lt;clientnumber&gt;&gt;</EM></LI></OL><P>Ex: <A href="http://erpclnt200:80/sap/bc/srt/idoc?sap-client=200" target="_blank" rel="noopener nofollow noreferrer">http://erpclnt200:80/sap/bc/srt/idoc?sap-client=200</A></P><OL><LI>Proxy Type:&nbsp;OnPremise</LI><LI>Authentication:&nbsp;None</LI></OL><P><STRONG>Creating Partner Profile Details</STRONG></P><P>Navigate to partner profile&gt; Create &gt; Trading partner</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_20-1775730290439.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395458i111BB8296E439DF4/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_20-1775730290439.png" alt="Rishikasairi_20-1775730290439.png" /></span></P><P><STRONG>Give the contact details</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_21-1775730315995.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395461i0507E424F2FE7150/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_21-1775730315995.png" alt="Rishikasairi_21-1775730315995.png" /></span></P><P><STRONG>Create Identifiers (for Trading Partner)</STRONG></P><UL><LI>One for ERP – CUSTOMER1</LI><UL><LI>Identification:&nbsp;<STRONG>CUSTOMER1</STRONG></LI><LI>Alias:&nbsp;<STRONG>CUSTOMER1</STRONG></LI><LI>Type System:&nbsp;<STRONG>SAP S/4HANA On Premise IDoc</STRONG></LI><LI>Scheme:&nbsp;<STRONG>N/A</STRONG></LI></UL><LI>One for EDI Identifier –&nbsp;<STRONG>CUST_1234</STRONG></LI><UL><LI>Identification:&nbsp;<STRONG>CUST_1234</STRONG></LI><LI>Alias:&nbsp;<STRONG>CUST_1234</STRONG></LI><LI>Type System: UN/EDIFACT</LI><LI>Scheme:&nbsp;<STRONG>N/A</STRONG></LI></UL></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_22-1775730340783.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395462iDCA8E5D3E398CEC2/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_22-1775730340783.png" alt="Rishikasairi_22-1775730340783.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_23-1775730354991.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395463i6E2593E8E17B7B74/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_23-1775730354991.png" alt="Rishikasairi_23-1775730354991.png" /></span></P><P>&nbsp;</P><P><STRONG>Create System (for Trading Partner)</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_24-1775734493458.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395501i556F3677EFFE7D4A/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_24-1775734493458.png" alt="Rishikasairi_24-1775734493458.png" /></span></P><P><STRONG>Create Type System (for Trading Partner)</STRONG></P><P>Create a Type System for the Trading Partner with the Below details</P><UL><LI>Name:&nbsp;UN/EDIFACT</LI><LI>Type:&nbsp;D.96A.S3, D.96B.S3</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_25-1775734525519.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395506iFFC34351B0155EF0/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_25-1775734525519.png" alt="Rishikasairi_25-1775734525519.png" /></span></P><P>&nbsp;</P><P><STRONG>Create Communication (for Trading partner)</STRONG></P><UL><LI>Name:&nbsp;CUST1_COMM_SFTP_PROCESSDIRECT_SENDER</LI><LI>Alias:&nbsp;CUST1_COMM_SFTP_PROCESSDIRECT_SENDER</LI><LI>Direction:&nbsp;Sender</LI><LI>Adapter:&nbsp;Process_Direct</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_26-1775734545913.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395507i285D1E77D2BC6288/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_26-1775734545913.png" alt="Rishikasairi_26-1775734545913.png" /></span></P><P><STRONG>Define Agreement Template</STRONG></P><P>The Agreement Template here is where CUSTOMER1 is the&nbsp;<STRONG>Initiator&nbsp;</STRONG>and ERPCLNT200 is the&nbsp;<STRONG>Reactor</STRONG></P><P>Go to Integration Suite -&gt;&nbsp;<STRONG>Design&nbsp;</STRONG>-&gt;&nbsp;<STRONG>B2B Scenarios</STRONG>&nbsp;-&gt;&nbsp;<STRONG>Agreement Templates</STRONG></P><OL><LI>Name:&nbsp;<STRONG>Customer1 Initiates EDIFACT ORDERS D96B</STRONG></LI><LI>System –&gt;<STRONG>&nbsp;ERP_ECC</STRONG></LI><LI>Type System –&gt;&nbsp;<STRONG>S/4 HANA On Premise IDoc</STRONG></LI><LI>Type System Version –&gt;&nbsp;<STRONG>701</STRONG></LI><LI>Identifier –&gt;&nbsp;<STRONG>ERPCLNT200</STRONG></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_27-1775734583901.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395508i9A82BC9389E110EB/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_27-1775734583901.png" alt="Rishikasairi_27-1775734583901.png" /></span></P><P>Create a B2B Scenario / Transaction</P><OL><LI>Name:&nbsp;<STRONG>EDIFACT ORDERS D96B To IDoc ORDERS.ORDERS05</STRONG></LI><LI>Business Transaction Pattern:&nbsp;<STRONG>One Way Notification</STRONG></LI></OL><P>My Company Role:&nbsp;<STRONG>Reactor</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_28-1775734623356.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395509i1402DB0F1E36F89E/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_28-1775734623356.png" alt="Rishikasairi_28-1775734623356.png" /></span></P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_29-1775734637587.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395511i89338C8C988C652C/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_29-1775734637587.png" alt="Rishikasairi_29-1775734637587.png" /></span></P><P>When you try to select the Message Implementation Guideline MIG; you will not be able to see your MIG. That is because your MIG was defined for S/4Hana 1709 but our ECC version is 701. Reset the filters and then the search will work.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_30-1775734731138.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395512i09A38C52E899FA46/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_30-1775734731138.png" alt="Rishikasairi_30-1775734731138.png" /></span></P><P>Define the Communication channel (IDoc) in your Template.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_31-1775734751565.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395513i84064CA5E86FFA41/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_31-1775734751565.png" alt="Rishikasairi_31-1775734751565.png" /></span></P><P><STRONG>Define Agreement</STRONG></P><P>Create&nbsp;<STRONG>Agreement</STRONG>&nbsp;in your Trading Partner Management as per below details.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_32-1775734782869.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395514i3A1CC500122FE7B0/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_32-1775734782869.png" alt="Rishikasairi_32-1775734782869.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_33-1775734794701.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395515iE12CE045864479B8/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_33-1775734794701.png" alt="Rishikasairi_33-1775734794701.png" /></span></P><P>Provide all the Information as shown below</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_34-1775734811310.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395516iF1F641970CC3B90E/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_34-1775734811310.png" alt="Rishikasairi_34-1775734811310.png" /></span></P><P>In the b2b Scenario</P><P>Provide Sender Communication Details in Trading Partner Agreement</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_35-1775734834864.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395517i1C143B84BB622E8A/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_35-1775734834864.png" alt="Rishikasairi_35-1775734834864.png" /></span></P><P>Provide Sender Interchange Details in Trading Partner Agreement</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_36-1775734863975.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395518iB29B927F0D4C1377/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_36-1775734863975.png" alt="Rishikasairi_36-1775734863975.png" /></span></P><P>Provide Mapping Details in Trading Partner Agreement</P><P>As per our scope, we will not use MAG and use a Message Mapping in Cloud Integration. Select option&nbsp;<STRONG>“Customized Mapping Processing”</STRONG>&nbsp;and provide your Process Direct endpoint of your Iflow (/<STRONG>tpm/Customer1/EDIFACT_ORDERSD86B/IDOC_ORDERS_ORDERS05</STRONG>). Note this endpoint as you will use it in the next step.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_37-1775734889724.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395519iB0B68FE7A977584D/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_37-1775734889724.png" alt="Rishikasairi_37-1775734889724.png" /></span></P><P>Provide Receiver Interchange Details in Trading Partner Agreement</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_38-1775734930975.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395521i4235D44C0AFE6611/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_38-1775734930975.png" alt="Rishikasairi_38-1775734930975.png" /></span></P><P>Provide Receiver Communication Details in Trading Partner</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_39-1775734952173.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395522iF36F596860C56593/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_39-1775734952173.png" alt="Rishikasairi_39-1775734952173.png" /></span></P><P>Save the Configurations</P><P><STRONG>Activate&nbsp;your Trading Partner Agreement (It should be up to date)</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_40-1775734981192.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395523i68BE96EE67BB8308/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_40-1775734981192.png" alt="Rishikasairi_40-1775734981192.png" /></span></P><P><STRONG>Create your Custom Mapping IFlow</STRONG></P><P>we need to have a custom mapping flow running on the Process Direct Endpoint:&nbsp;/tpm/Customer1/EDIFACT_ORDERSD86B/IDOC_ORDERS_ORDERS05</P><P>Create an IFlow as below</P><P>If we have any mapping logic we can add here in this iflow (for now I’m not adding any mapping)</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_41-1775735087213.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395525i4DDDDC98683DB887/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_41-1775735087213.png" alt="Rishikasairi_41-1775735087213.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_42-1775735098935.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395526i28DDB7706C9BF331/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_42-1775735098935.png" alt="Rishikasairi_42-1775735098935.png" /></span></P><P>Create other Iflow as below (used to trigger the whole process)</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_43-1775735138762.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395527iD721C83AB5317306/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_43-1775735138762.png" alt="Rishikasairi_43-1775735138762.png" /></span></P><P>I’m using Standard Trading Partner Management v2 package so according to that I added headers and address details (end of document you can find more information and how it works)</P><P>In this Iflow we will do these configurations</P><P>Adding headers According to the groovy script From TPMv2 package</P><P>SAP_EDI_Receiver_ID_Qualifier</P><P>SAP_EDI_Sender_ID_Qualifier</P><P>SAP_EDI_Message_Release</P><P>SAP_EDI_Sender_ID</P><P>SAP_COM_SND_Adapter_Type</P><P>SAP_EDI_Receiver_ID</P><P>SAP_EDI_Message_Type</P><P>SAP_EDI_Message_Version</P><P>SAP_EDI_Document_Standard</P><P><STRONG>EDI Custom Headers </STRONG></P><P>SAP_EDI_Document_Standard</P><P>&nbsp;</P><P><STRONG>Process Direct Address</STRONG></P><P>From the Standard package (Sender Process Direct Communication Flow V2)</P><P>&nbsp;</P><P>&nbsp;</P><P><STRONG>EDI PAYLOAD</STRONG></P><P>UNA:+.? '</P><P>UNB+UNOA:1+CUST_1234+SELF_1234+240204:1000+1'</P><P>UNH+1+ORDERS:D:96B:UN:S3'</P><P>BGM+220+PO-123456+9'</P><P>DTM+137:20240204:102'</P><P>NAD+BY+CUST_1234::9'</P><P>NAD+SU+SELF_1234::9'</P><P>UNS+S'</P><P>UNT+8+1'</P><P>UNZ+1+1'</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_44-1775735229870.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395528iF906474C4FE6E845/image-size/medium?v=v2&amp;px=400" role="button" title="Rishikasairi_44-1775735229870.png" alt="Rishikasairi_44-1775735229870.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_45-1775735239826.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395529i72C5AFF6D552285D/image-size/medium?v=v2&amp;px=400" role="button" title="Rishikasairi_45-1775735239826.png" alt="Rishikasairi_45-1775735239826.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_46-1775735251549.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395530i31EAA3E1420EC963/image-size/medium?v=v2&amp;px=400" role="button" title="Rishikasairi_46-1775735251549.png" alt="Rishikasairi_46-1775735251549.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_47-1775735260859.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395531iC163469C787A72AB/image-size/medium?v=v2&amp;px=400" role="button" title="Rishikasairi_47-1775735260859.png" alt="Rishikasairi_47-1775735260859.png" /></span></P><P><STRONG>Configure / Customize Standard IFlows</STRONG></P><P>Navigate to Discover -&gt; Integrations and Copy the Standard Package<BR /><STRONG>Cloud Integration – Trading Partner Management V2</STRONG>&nbsp;to your tenant</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_48-1775735292249.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395532i6CCA3C00E67BBE97/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_48-1775735292249.png" alt="Rishikasairi_48-1775735292249.png" /></span></P><P>Deploy all the 11 Artifacts</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_49-1775735311551.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395533i62D5B997EB8E97A4/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_49-1775735311551.png" alt="Rishikasairi_49-1775735311551.png" /></span></P><P>Deploy custom flows along with standard package flows</P><P>To check TPM activity, navigate to <STRONG>Monitor &gt; B2B Scenario &gt; Interchange</STRONG> tab. There, you can view all the details, including which agreement was triggered, where the payload originated, where it was sent, and other related information.</P><P>From this Package we will use these artifacts</P><UL><LI><STRONG>Reusable Groovy Scripts V2</STRONG></LI><LI><STRONG>Step 1 – Sender Process Direct Communication Flow V2</STRONG></LI><LI><STRONG>Step 1b - Write Message to Message Queue</STRONG></LI><LI><STRONG>Step 2 – Interchange Processing Flow V2</STRONG></LI><LI><STRONG>Step 3 – Receiver Communication Flow V2</STRONG></LI></UL><P>&nbsp;</P><P>Reusable Groovy Scripts V2 – Modified Headers in custom iflow according to this script</P><P>Step 1 – Sender Process Direct Communication Flow V2 à Connecting our custom iflow to this artifact using Process direct Address&nbsp;</P><P>Step 1b - Write Message to Message Queue àStoring the payload with the headers from content modifier in JMS</P><P>Step 2 – Interchange Processing Flow V2 àMain logic of v2 package(vadidates headers payload with agreement à groovy runsà validates pd lookup runs the logic of v2 standard package)</P><P>Step 3 – Receiver Communication Flow V2 à Receives the payload with all the modification like mappings/transformation etc and enters s/4 hana through idoc</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Rishikasairi_56-1775735964556.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395538i66DCA37C1DCB9425/image-size/large?v=v2&amp;px=999" role="button" title="Rishikasairi_56-1775735964556.png" alt="Rishikasairi_56-1775735964556.png" /></span></P><P>Let me explain what happens <STRONG>from the moment the EDI file arrives</STRONG>.</P><P><STRONG>External Partner sends EDIFACT message</STRONG></P><P>The external trading partner <STRONG>Customer1</STRONG> sends an <STRONG>EDIFACT ORDERS D96B</STRONG> message.</P><P>In our test case, the payload looks like this :</P><UL><LI><STRONG>UNB Sender</STRONG> → CUST_1234 (Customer)</LI><LI><STRONG>UNB Receiver</STRONG> → SELF_1234 (Our company)</LI></UL><P>This direction is very important.</P><P>This means:</P><P>Customer → Our Company</P><P>TPM does <STRONG>not blindly trust custom headers</STRONG>.</P><P>Instead, the standard CPI B2B runtime:</P><UL><LI>Reads the <STRONG>EDI envelope (UNB, UNH)</STRONG></LI><LI>Determines:</LI><UL><LI>Who is the sender</LI><LI>Who is the receiver</LI><LI>Message type (ORDERS)</LI><LI>Version (D96B)</LI></UL></UL><P>So, if the <STRONG>UNB sender/receiver is wrong</STRONG>, TPM will:</P><UL><LI>Override headers</LI><LI>Build the wrong Partner ID</LI><LI>Fail Partner Directory lookup</LI></UL><P>That’s exactly what happened during debugging.</P><P><STRONG>TPM AGREEMENT</STRONG></P><P>What this agreement means:</P><UL><LI><STRONG>Initiator (Sender)</STRONG> → Customer (CUST_1234)</LI><LI><STRONG>Responder (Receiver)</STRONG> → Our Company (SELF_1234)</LI><LI>Document:</LI><UL><LI>Standard: UN-EDIFACT</LI><LI>Message Type: ORDERS</LI><LI>Version: D</LI><LI>Release: 96B</LI></UL></UL><P>When this agreement is activated, TPM automatically creates a <STRONG>Partner ID (PID)</STRONG> internally, something like:</P><P>SAP_TPM_xxxxxxxxxxxxxxxxxxxxxxxx</P><P>This PID is stored in the <STRONG>Partner Directory</STRONG>.</P><P>When the message comes in, a <STRONG>standard TPM Groovy script</STRONG> runs (the one that failed at line 585).</P><P>This script:</P><OL><LI>Reads sender/receiver info</LI><LI>Builds a <STRONG>PID lookup string</STRONG>, for example:</LI><LI>Process_Direct-UN-EDIFACT--D.96B-CUST_1234-----SELF_1234-----ORDERS</LI><LI>Hashes this string</LI><LI>Looks it up in <STRONG>Partner Directory</STRONG></LI></OL><P>If the string <STRONG>exactly matches</STRONG> what was created during agreement activation → success<BR />If even one value is wrong → lookup fails</P> 2026-04-13T13:33:55.732000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/pgp-encryption-and-decryption-in-sap-cloud-integration-a-step-by-step-guide/ba-p/14370923 PGP Encryption and Decryption in SAP Cloud Integration – A Step-by-Step Guide 2026-04-13T13:37:57.349000+02:00 yassinezaid https://community.sap.com/t5/user/viewprofilepage/user-id/2029403 <H1 id="toc-hId-1665004242"><SPAN>Introduction</SPAN></H1><H2 id="toc-hId-1597573456"><SPAN>What is PGP?</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>PGP <STRONG>(Pretty Good Privacy)</STRONG> is an encryption standard used to protect data through a combination of symmetric and asymmetric cryptography. In the context of SAP Cloud Integration (CPI), PGP is used to encrypt and decrypt message payloads to ensure that sensitive data remains secure during transmission between systems.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="yassinezaid_0-1775826755815.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396087i4E3CF4BDEC3A48B7/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_0-1775826755815.png" alt="yassinezaid_0-1775826755815.png" /></span></P><P class="lia-align-center" style="text-align: center;">&nbsp;</P><P class="lia-align-center" style="text-align: center;">&nbsp;</P><P class="lia-align-center" style="text-align: center;">&nbsp;</P><P class="lia-align-center" style="text-align: center;">&nbsp;</P><P class="lia-align-center" style="text-align: center;">&nbsp;</P><P class="lia-align-justify" style="text-align : justify;"><SPAN>PGP encryption is a common requirement in enterprise integrations, particularly when exchanging sensitive information such as bank account numbers, salary data, or personal records with external partners.</SPAN></P><H2 id="toc-hId-1401059951"><SPAN>Why Use PGP in SAP Cloud Integration?</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>In many integration scenarios, the data exchanged between systems contains sensitive information that must be protected. For example, when integrating SAP SuccessFactors with a banking system to share employee bank account numbers for salary payments, the payload must be encrypted before being sent to the external partner.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_1-1775826755820.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396088i420BE12AD0FEBC8B/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_1-1775826755820.png" alt="yassinezaid_1-1775826755820.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>PGP encryption ensures that even if the message is intercepted during transit, its content cannot be read without the corresponding decryption key. This makes PGP one of the most widely used encryption methods in SAP Cloud Integration and a best practice for securing message payloads.</SPAN></P><H2 id="toc-hId-1204546446"><SPAN>How PGP Works: Public and Private Keys</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>PGP operates on the principle of asymmetric encryption, which involves a pair of cryptographic keys:</SPAN></P><UL class="lia-align-justify" style="text-align : justify;"><LI><SPAN><STRONG>Public Key:</STRONG> used to encrypt the message. This key can be shared openly with communication partners.</SPAN></LI><LI><SPAN><STRONG>Private Key:</STRONG> used to decrypt the message. This key must be kept secure and never shared.</SPAN></LI></UL><P class="lia-align-justify" style="text-align : justify;"><SPAN>These two keys are mathematically linked. A message encrypted with a public key can only be decrypted with the corresponding private key, and vice versa. This is often referred to as a key pair.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><STRONG><EM><SPAN>Note: </SPAN></EM></STRONG><EM><SPAN>Some fields in the screenshots throughout this document have been intentionally hidden using white masking boxes to protect sensitive information.</SPAN></EM></P><H1 id="toc-hId-878950222"><SPAN>Key Exchange Principles</SPAN></H1><P class="lia-align-justify" style="text-align : justify;"><SPAN>Understanding how keys are exchanged between parties is essential for implementing PGP encryption correctly.</SPAN></P><H2 id="toc-hId-811519436"><SPAN>Encrypting a Message for a Partner</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>When we need to send an encrypted message to a partner, the following applies:</SPAN></P><UL class="lia-align-justify" style="text-align : justify;"><LI><SPAN>We use our public key to encrypt the outgoing message.</SPAN></LI><LI><SPAN>We share our private key with the partner so they can decrypt the message.</SPAN></LI></UL><P class="lia-align-justify" style="text-align : justify;"><SPAN>In this scenario, the private key acts as the decryption credential for the receiving party.</SPAN></P><H2 id="toc-hId-615005931"><SPAN>Decrypting a Message from a Partner</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>When a partner sends us an encrypted message, the following applies:</SPAN></P><UL class="lia-align-justify" style="text-align : justify;"><LI><SPAN>The partner uses their public key to encrypt the message before sending it.</SPAN></LI><LI><SPAN>We need the corresponding private key (provided by the partner) to decrypt the message.</SPAN></LI></UL><P class="lia-align-justify" style="text-align : justify;"><SPAN>In both cases, the public key encrypts the data, and the private key decrypts it. The key pair must always match.</SPAN></P><H1 id="toc-hId-289409707"><SPAN>Generating a PGP Key Pair</SPAN></H1><P class="lia-align-justify" style="text-align : justify;"><SPAN>Before configuring PGP in SAP Cloud Integration, a key pair (public and private) must be generated. Several tools are available for this purpose.</SPAN></P><H2 id="toc-hId-221978921"><SPAN>Using Kleopatra (Desktop Application)</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>Kleopatra is a widely used open-source certificate manager and GUI for GnuPG. It provides a user-friendly interface for generating, managing, and exporting PGP key pairs.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_2-1775826755835.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396089iCB15E1A9BFE613A8/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_2-1775826755835.png" alt="yassinezaid_2-1775826755835.png" /></span></P><H2 id="toc-hId-25465416"><SPAN>Using an Online Key Generator</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>For educational and testing purposes, online tools such as pgpkeygen.com can be used to generate a PGP key pair quickly. The tool generates both a public key file and a secret (private) key file that can be downloaded directly.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_3-1775826755842.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396092iB118AB8642FFFEDA/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_3-1775826755842.png" alt="yassinezaid_3-1775826755842.png" /></span></P><H2 id="toc-hId-176206268"><SPAN>Understanding the Generated Files</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>After generating the key pair, the following files are typically produced:</SPAN></P><UL class="lia-align-justify" style="text-align : justify;"><LI><SPAN>Public key file (.pub or .asc): used for encryption.</SPAN></LI><LI><SPAN>Secret key file (.sec or .asc): used for decryption.</SPAN></LI></UL><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_4-1775826755842.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396090i1CD70754775B21B6/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_4-1775826755842.png" alt="yassinezaid_4-1775826755842.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>Additionally, a passphrase is defined during the key generation process. <STRONG>This passphrase is required whenever the private key is used for decryption and serves as an additional layer of security.</STRONG></SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_5-1775826755843.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396091iAD8CEA06427730F0/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_5-1775826755843.png" alt="yassinezaid_5-1775826755843.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><STRONG><EM><SPAN>Note: </SPAN></EM></STRONG><EM><SPAN>The passphrase must be saved securely. Without it, the private key cannot be used for decryption.</SPAN></EM></P><H1 id="toc-hId-273095770"><SPAN>Uploading PGP Keys to SAP BTP</SPAN></H1><P class="lia-align-justify" style="text-align : justify;"><SPAN>Once the key pair has been generated, the keys must be uploaded to the SAP BTP Integration Suite so that SAP Cloud Integration can use them for encryption and decryption operations.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_6-1775826755846.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396095iF764FDFCA0C01599/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_6-1775826755846.png" alt="yassinezaid_6-1775826755846.png" /></span></P><H2 id="toc-hId--216820742"><SPAN>Uploading the Public Key</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>The public key file (.pub) is uploaded to the PGP Keys section in the SAP Integration Suite Monitor. This key will be referenced by the PGP Encryptor step in the integration flow.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_7-1775826755847.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396093i817800E781B6C88C/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_7-1775826755847.png" alt="yassinezaid_7-1775826755847.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_8-1775826755849.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396094i589FB75321EEF363/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_8-1775826755849.png" alt="yassinezaid_8-1775826755849.png" /></span></P><H2 id="toc-hId--413334247"><SPAN>Uploading the Private Key</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>The private (secret) key file is also uploaded to the PGP Keys section. When uploading a secret key, the system prompts for the passphrase that was defined during key generation.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_9-1775826755850.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396096i49FB6349DB9A6465/image-size/medium?v=v2&amp;px=400" role="button" title="yassinezaid_9-1775826755850.png" alt="yassinezaid_9-1775826755850.png" /></span></P><H2 id="toc-hId--609847752"><SPAN>Verifying the Uploaded Keys</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>After uploading, both keys appear in the PGP Keys list in the Integration Suite Monitor. The public key is identified by its Key User ID, which will be referenced later in the integration flow configuration.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_10-1775826755851.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396099i9D6007BD6A347B93/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_10-1775826755851.png" alt="yassinezaid_10-1775826755851.png" /></span></P><H1 id="toc-hId--512958250"><SPAN>Configuring PGP in SAP Cloud Integration</SPAN></H1><H2 id="toc-hId--1002874762"><SPAN>PGP Encryptor Configuration</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_11-1775826755851.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396097i3975C71E1F677865/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_11-1775826755851.png" alt="yassinezaid_11-1775826755851.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>The PGP Encryptor is a processing step in the SAP Cloud Integration flow that encrypts the message payload using PGP before it is sent to the receiver.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>To configure the PGP Encryptor, the Encryption Key User ID must be specified. This value corresponds to the public key identifier that was uploaded in the PGP Keys section of the Integration Suite Monitor.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_12-1775826755854.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396103i2C6E477A14F2D007/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_12-1775826755854.png" alt="yassinezaid_12-1775826755854.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>The Encryption Key User ID tells the PGP Encryptor which public key to use for encrypting the payload.</SPAN></P><H2 id="toc-hId--1199388267"><SPAN>PGP Decryptor Configuration</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_13-1775826755854.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396101iFFD2587929F004BF/image-size/medium?v=v2&amp;px=400" role="button" title="yassinezaid_13-1775826755854.png" alt="yassinezaid_13-1775826755854.png" /></span></P><P class="lia-align-justify" style="text-align : justify;">&nbsp;</P><P class="lia-align-justify" style="text-align : justify;"><SPAN>The PGP Decryptor is used to decrypt incoming messages that have been encrypted with PGP. Unlike the PGP Encryptor, the Decryptor does not require a specific key reference in its configuration. It automatically retrieves the appropriate private key from the PGP Keys stored in SAP BTP.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>The decryption process uses the passphrase-protected private key that was uploaded earlier. SAP Cloud Integration handles the key retrieval and decryption automatically.</SPAN></P><H1 id="toc-hId--1102498765"><SPAN>Testing the PGP Encryption and Decryption Flow</SPAN></H1><P class="lia-align-justify" style="text-align : justify;"><SPAN>To validate the PGP configuration, a test can be performed using a simple text payload in the integration flow.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_14-1775826755857.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396102i2F383B5DAAEBD6D6/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_14-1775826755857.png" alt="yassinezaid_14-1775826755857.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_15-1775826755858.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396106i27F0AE10E92FD516/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_15-1775826755858.png" alt="yassinezaid_15-1775826755858.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_16-1775826755860.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396104iF357BDE962DF81FC/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_16-1775826755860.png" alt="yassinezaid_16-1775826755860.png" /></span></P><H2 id="toc-hId--1592415277"><SPAN>Before Encryption</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>The original message payload is a plain text value that is visible and readable.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_17-1775826755861.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396105i0844F23B4DD6C43F/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_17-1775826755861.png" alt="yassinezaid_17-1775826755861.png" /></span></P><H2 id="toc-hId--1620745091"><SPAN>After Encryption</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>After the PGP Encryptor step processes the message, the payload is transformed into an encrypted PGP block. The content is no longer readable and can only be decrypted using the corresponding private key.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_18-1775826755863.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396108i954A347B3B297858/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_18-1775826755863.png" alt="yassinezaid_18-1775826755863.png" /></span></P><H2 id="toc-hId--1817258596"><SPAN>After Decryption</SPAN></H2><P class="lia-align-justify" style="text-align : justify;"><SPAN>After the PGP Decryptor step processes the encrypted message, the original plain text payload is restored. This confirms that both the encryption and decryption steps are configured correctly and that the key pair is valid.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="yassinezaid_19-1775826755864.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/396107iE1AE978B925CDEA3/image-size/large?v=v2&amp;px=999" role="button" title="yassinezaid_19-1775826755864.png" alt="yassinezaid_19-1775826755864.png" /></span></P><H1 id="toc-hId--1720369094"><SPAN>Best Practices and Security Considerations</SPAN></H1><P class="lia-align-justify" style="text-align : justify;"><SPAN>When implementing PGP encryption in SAP Cloud Integration, the following best practices should be observed:</SPAN></P><UL class="lia-align-justify" style="text-align : justify;"><LI><SPAN>Private keys and passphrases should never be shared in emails, documents, or screenshots. They must be transmitted through secure channels.</SPAN></LI><LI><SPAN>Passphrases should be stored securely and never hardcoded in integration flow configurations.</SPAN></LI><LI><SPAN>Key pairs should be rotated periodically to maintain a strong security posture.</SPAN></LI><LI><SPAN>When exchanging keys with external partners, always verify the key fingerprint to ensure authenticity.</SPAN></LI><LI><SPAN>Use the SAP Integration Suite Monitor to manage and audit PGP keys centrally.</SPAN></LI><LI><SPAN>For production environments, prefer desktop tools such as Kleopatra over online generators for key pair creation.</SPAN></LI></UL><P class="lia-align-justify" style="text-align : justify;"><SPAN>Following these practices ensures that PGP encryption is implemented securely, professionally, and in alignment with enterprise integration standards.</SPAN></P><H1 id="toc-hId--1916882599"><SPAN>Conclusion</SPAN></H1><P class="lia-align-justify" style="text-align : justify;"><SPAN>PGP encryption provides a robust and widely adopted mechanism for securing message payloads in SAP Cloud Integration. By leveraging asymmetric encryption with public and private key pairs, sensitive data can be transmitted securely between integration partners.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>This document covered the complete PGP workflow in SAP Cloud Integration: from understanding the encryption principles and generating a key pair, to uploading keys to SAP BTP, configuring the PGP Encryptor and Decryptor steps, and testing the end-to-end flow.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>By adopting PGP encryption and following the recommended security practices, integrations can be implemented in a way that is secure, maintainable, and aligned with enterprise standards.</SPAN></P> 2026-04-13T13:37:57.349000+02:00 https://community.sap.com/t5/integration-blog-posts/how-to-develop-an-api-provider-api-proxy-product-and-application-in-sap-api/ba-p/14369993 how to develop an API Provider, API Proxy, Product, and Application in SAP API Management 2026-04-14T12:44:01.945000+02:00 Trupti81 https://community.sap.com/t5/user/viewprofilepage/user-id/1861483 <P><SPAN class="">This content is a stepwise instruction on how to develop an API Provider, API Proxy, Product, and Application in SAP API Management.</SPAN> <SPAN class="">It will provide users with insights on how to safely expose and operate APIs with OAuth and basic authentication schemes.</SPAN> <SPAN class="">You will get to know how to set up connections, create proxies and make APIs available as products.</SPAN> <SPAN class="">Also, the blog discusses how to build and maintain apps in the Developer Hub.</SPAN> <SPAN class="">The guide is aimed at SAP consultants and developers as well as beginners who deal with API Management.</SPAN></P><P>&nbsp;</P><P><STRONG>Create API Provider ,API Proxy,Product &amp; Application</STRONG></P><P><STRONG>Creation of API Provider-:</STRONG></P><P>1. Under Config Section In API’s Navigate to API Provider Sub-Section and Click on Create<SPAN class="">&nbsp; </SPAN><SPAN><STRONG><BR /></STRONG></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_0-1775742382852.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395572iCC5F255732BDD698/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_0-1775742382852.png" alt="Trupti81_0-1775742382852.png" /></span></P><P>2. In Overview tab enter the description<SPAN class="">&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_1-1775742401111.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395573iAEC9D39B67522FE3/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_1-1775742401111.png" alt="Trupti81_1-1775742401111.png" /></span></P><P>3. In the Connection tab Enter the host details,Port Number &amp; Check on Use SSL</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_2-1775742423150.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395574i447F02DF54879F90/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_2-1775742423150.png" alt="Trupti81_2-1775742423150.png" /></span></P><P>4. In Catalog tab keep the default setting and click onSave.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_3-1775742439739.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395575i993D5D3C6681693E/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_3-1775742439739.png" alt="Trupti81_3-1775742439739.png" /></span></P><P>5. Click on Test Connection IT should ping 200 status code now you have setup your API Provider.</P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_4-1775742454537.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395576iA367B851D5FA4DE3/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_4-1775742454537.png" alt="Trupti81_4-1775742454537.png" /></span></P><P><STRONG>Creation of API Proxy-: 1. Main Proxy (token verification &amp; basic auth)<BR /><SPAN class="">&nbsp; </SPAN>2. OAuth Proxy (token generation proxy)</STRONG></P><P>We will proceed with OAuth proxy first to create the Bearer token.<BR /><BR />1. Navigate to API Proxy sub-tab and click on create as shown below.<SPAN class="">&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_5-1775742476924.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395577i7E33B053F2DFF7DE/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_5-1775742476924.png" alt="Trupti81_5-1775742476924.png" /></span></P><P>2. Select URL fill the details as shown below &amp; click on create to generate the api proxy.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_6-1775742493005.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395578i25914C5516FDEA52/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_6-1775742493005.png" alt="Trupti81_6-1775742493005.png" /></span></P><P>3. After Clicking on Create an api proxy dialog box will open navigate to proxy end points and fill the details as shown &amp; click on save.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_7-1775742509360.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395579i373E30C6C2CC19B5/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_7-1775742509360.png" alt="Trupti81_7-1775742509360.png" /></span></P><P>4. Click on Policies and navigate to the Policy Editor.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_8-1775742525389.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395580i463CD8DE9D4C60B0/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_8-1775742525389.png" alt="Trupti81_8-1775742525389.png" /></span></P><P>5. You will see two main sections<BR />Proxy Endpoint: Handles client-side logic (e.g., OAuth, API key validation)<BR />Target Endpoint: Handles backend-side logic (e.g., Basic Auth)<BR />We will create policies on proxy end point.</P><P>6. Click on PreFlow under ProxyEndpoint, then add the following policies in order in request and response pipeline :</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_9-1775742553215.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395583i6EA0B518A19E0B3C/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_9-1775742553215.png" alt="Trupti81_9-1775742553215.png" /></span></P><P><SPAN><STRONG>Request-pipeline policies<BR /><BR />JS-Policy</STRONG></SPAN></P><P>1. On the right pane of the window click on edit and under extension policies group click on javascript policies as shown &amp; click on add.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_10-1775742569421.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395584iE93EC45D2DF0C3E6/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_10-1775742569421.png" alt="Trupti81_10-1775742569421.png" /></span></P><P>Now Click on the policy and paste the below xml code.</P><P>&lt;!-- this policy allows us to execute java script code during execution of an API Proxy --&gt;</P><P>&lt;Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" xmlns='<A href="http://www.sap.com/apimgmt" target="_blank" rel="noopener noreferrer">http://www.sap.com/apimgmt</A>'&gt;</P><P>&nbsp;</P><P><SPAN class="">&nbsp; &nbsp; </SPAN>&lt;!-- contains the name of the main code file --&gt;</P><P><SPAN class="">&nbsp; &nbsp; </SPAN>&lt;ResourceURL&gt;jsc://ExtractParam.js&lt;/ResourceURL&gt;</P><P>&lt;/Javascript&gt;</P><P>Now we have to create the script for this JS policy<BR />On the left pane of the window in scripts section click on + Icon fill the details as shown.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_11-1775742610393.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395585iB7B8ADFB7F1664BF/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_11-1775742610393.png" alt="Trupti81_11-1775742610393.png" /></span></P><P><SPAN>After Clicking on Add Button Paste this Script.<BR /><BR /></SPAN>var gr_type_header = context.getVariable("request.header.grant_type");</P><P>var gr_type_queryParam = context.getVariable("request.queryparam.grant_type");</P><P>var gr_type;</P><P>&nbsp;</P><P>if(gr_type_queryParam)</P><P>{</P><P><SPAN class="">&nbsp; &nbsp; </SPAN>gr_type = gr_type_queryParam;</P><P>}</P><P>else if (gr_type_header)</P><P>{</P><P><SPAN class="">&nbsp; &nbsp; </SPAN>gr_type = gr_type_header;</P><P>}</P><P>else</P><P>{</P><P><SPAN class="">&nbsp; &nbsp; </SPAN>gr_type = "";</P><P>}</P><P>&nbsp;</P><P>context.setVariable("request.queryparam.grant_type", gr_type);<BR /><BR /></P><P><STRONG>TargetEndpoint pre-flow policies<BR /></STRONG></P><P>Request-pipeline policies<BR /><BR /><STRONG>1. KVM Operations </STRONG>-:follow similar steps to add the policy.<BR /><BR />Name -: KVM-GetParams<BR /><BR />XML Code -:<BR />&lt;KeyValueMapOperations mapIdentifier="TestBasicAuthCreds" async="true" continueOnError="true" enabled="true" xmlns="<A href="http://www.sap.com/apimgmt" target="_blank" rel="noopener noreferrer">http://www.sap.com/apimgmt</A>"&gt;</P><P>&lt;Get assignTo="private.username" index='1'&gt;</P><P>&lt;Key&gt;</P><P>&lt;Parameter&gt;clientid&lt;/Parameter&gt;</P><P>&lt;/Key&gt;</P><P>&lt;/Get&gt;</P><P>&lt;Get assignTo="private.password"&gt;</P><P>&lt;Key&gt;</P><P>&lt;Parameter&gt;clientsecret&lt;/Parameter&gt;</P><P>&lt;/Key&gt;</P><P>&lt;/Get&gt;</P><P>&nbsp;</P><P>&nbsp;</P><P>&lt;Scope&gt;environment&lt;/Scope&gt;</P><P>&lt;/KeyValueMapOperations&gt;</P><P>&nbsp;</P><P><STRONG>KVM</STRONG><BR /><BR />a.Duplicate the tab &amp; navigate to config section under Apis click on Key Value Maps and hit the create button.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_12-1775742769334.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395591i0F8058BA73F5FD69/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_12-1775742769334.png" alt="Trupti81_12-1775742769334.png" /></span></P><P>&nbsp;</P><P>b. Fill the details as shown add the respective key’s encrypt the kvm and save it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_13-1775742784440.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395592iAD9D89706E060CB9/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_13-1775742784440.png" alt="Trupti81_13-1775742784440.png" /></span></P><P>On the right pane of window click on update and navigate to proxy main window and click on save &amp; deploy the proxy as shown.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_14-1775742856847.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395595i1109BD8E96E9420C/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_14-1775742856847.png" alt="Trupti81_14-1775742856847.png" /></span></P><P><STRONG>Product &amp; Application Creation<BR /><BR /></STRONG><SPAN>Publishing the product</SPAN><STRONG><BR /></STRONG></P><P>1. On left pane of window navigate to engage section in product hit the create icon.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_15-1775742874856.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395598i2E2FB01BBCCFF839/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_15-1775742874856.png" alt="Trupti81_15-1775742874856.png" /></span></P><P>2. In create product dialogue box fill the section as shown and add the respective proxies<BR /><STRONG><BR /></STRONG></P><OL><LI>Fill the mandatory fields in overview section as shown<BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_16-1775742910402.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395599i96B342F9E398E8E9/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_16-1775742910402.png" alt="Trupti81_16-1775742910402.png" /></span><P>b. Navigate to api’s section and add the proxies and hit the publish button.</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_17-1775742932348.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395601iEFEC91BEFCEF8B66/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_17-1775742932348.png" alt="Trupti81_17-1775742932348.png" /></span><P>Now the product is published and proxies are bundled together next we will create application in developer hub.</P></LI></OL><P><STRONG>Developer Hub<BR /><BR /></STRONG><SPAN>Creating application</SPAN><STRONG><BR /><BR />Prerequisites-: </STRONG>AuthGroup.API.ApplicationDeveloper<BR />role must be assign to user sub-account if not assign it in sub-account under security section.<BR /><BR /><BR />1. On the top right pane of window click on Explore Our Ecosystem dots and navigate to developer hub as shown.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_18-1775742962986.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395605i920222E8F0A5EB42/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_18-1775742962986.png" alt="Trupti81_18-1775742962986.png" /></span></P><P>2. In developer hub click on register button as shown.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_19-1775742978033.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395607i89C150E3421CFF54/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_19-1775742978033.png" alt="Trupti81_19-1775742978033.png" /></span></P><P>3. Fill the details select select country/region as India.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_20-1775742995131.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395608iDBCD22042D1CD2BD/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_20-1775742995131.png" alt="Trupti81_20-1775742995131.png" /></span></P><P>4. Click on <STRONG>admin center</STRONG> navigate to <STRONG>users.</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_21-1775743014727.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395609iAEBB2AD7CD1E9DE0/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_21-1775743014727.png" alt="Trupti81_21-1775743014727.png" /></span></P><P>5. Move to <STRONG>Registered user</STRONG> section and assign developer role to your self by clicking on <STRONG>action</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_22-1775743030014.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395610iEA512B5D6D676467/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_22-1775743030014.png" alt="Trupti81_22-1775743030014.png" /></span></P><P>6. Check box the developer and save it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_23-1775743047189.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395611iD768311F462D5E97/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_23-1775743047189.png" alt="Trupti81_23-1775743047189.png" /></span></P><P>7. In Developer Hub Navigate to my workspace tab and hit the create button.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_24-1775743065922.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395612i7ED445BACF34969A/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_24-1775743065922.png" alt="Trupti81_24-1775743065922.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_25-1775743076863.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395613i3A2BB5CEEC2C0E4F/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_25-1775743076863.png" alt="Trupti81_25-1775743076863.png" /></span></P><P>3. Follow the steps as shown.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_26-1775743154068.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395614i6F0C433255304EEC/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_26-1775743154068.png" alt="Trupti81_26-1775743154068.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_27-1775743165124.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395615iF267813746A32268/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_27-1775743165124.png" alt="Trupti81_27-1775743165124.png" /></span></P><P>4. After clicking on save button an application window will open which have client credentials copies<SPAN class="">&nbsp;</SPAN></P><P>the key and secret</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Trupti81_28-1775743191397.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/395618iF8ABD7C89C0BF444/image-size/medium?v=v2&amp;px=400" role="button" title="Trupti81_28-1775743191397.png" alt="Trupti81_28-1775743191397.png" /></span></P><P>&nbsp;</P><P>The end result of this process is&nbsp;operational API set-up within the SAP API Management with an API Provider set to connect to the backend system.The API is packaged and released as a Product, and thus can be consumed.</P><P>&nbsp;</P> 2026-04-14T12:44:01.945000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/sap-integration-suite-licensing-a-practical-guide-for-businesses-and/ba-p/14375785 SAP Integration Suite Licensing: A Practical Guide for Businesses and Architects 2026-04-16T11:16:02.182000+02:00 naveen4796 https://community.sap.com/t5/user/viewprofilepage/user-id/13527 <P><FONT size="4"><STRONG>Introduction</STRONG></FONT></P><P>Within the SAP ecosystem, developers benefit from extensive documentation and technical tutorials. However, business leaders, enterprise architects, procurement teams, and startups often struggle to find clear guidance on licensing, pricing, and commercial models—particularly for SAP Integration Suite.</P><P>This blog bridges that gap by offering a practical, business-focused overview of SAP Integration Suite licensing, along with real-world case studies that illustrate how organizations can select the most suitable commercial model.</P><P><FONT size="4"><STRONG>Why Licensing Information Is Hard to Find</STRONG></FONT></P><P>Unlike technical documentation, commercial details are not widely publicized. Key reasons include:</P><P><EM><STRONG>1. Tailored Pricing Models</STRONG></EM></P><P>SAP solutions are customised based on:</P><UL><LI>Organization size and industry</LI><LI>Integration volumes and complexity</LI><LI>Geographic presence</LI><LI>Compliance requirements</LI><LI>Existing SAP investments</LI></UL><P><EM><STRONG>2. Sales-Led Engagement Model</STRONG></EM></P><P>Licensing information is typically provided through:</P><UL><LI>SAP account executives</LI><LI>Authorized SAP partners</LI><LI>Commercial proposals and Statements of Work</LI></UL><P><EM><STRONG>3. Consumption-Based Cloud Economics</STRONG></EM></P><P>SAP Business Technology Platform (BTP) follows a consumption-based model where costs depend on usage metrics such as:</P><UL><LI>Integration runtime capacity</LI><LI>Messages processed</LI><LI>API calls and events</LI><LI>Compute and memory utilization</LI><LI>Additional capabilities like B2B Integration and API Management</LI></UL><P><EM><STRONG>4. Rapid Evolution of SAP Offerings</STRONG></EM></P><P>SAP frequently enhances its cloud offerings, making static pricing references less reliable over time.</P><P><FONT size="4"><STRONG>Overview of SAP Integration Suite Commercial Models</STRONG></FONT></P><P><STRONG><EM>1. Free Tier</EM></STRONG></P><P><FONT face="comic sans ms,sans-serif">Best For:</FONT> Developers, students, and innovation teams</P><P><FONT face="comic sans ms,sans-serif">Purpose:</FONT> Learning, experimentation, and prototyping</P><P><FONT face="comic sans ms,sans-serif">Benefits:</FONT></P><UL><LI>No cost</LI><LI>Ideal for proofs of concept</LI><LI>Hands-on experience</LI></UL><P><FONT face="comic sans ms,sans-serif">Limitations:</FONT></P><UL><LI>Restricted resources</LI><LI>Not intended for production use</LI></UL><P><STRONG><EM>2. Pay-As-You-Go (PAYG)</EM></STRONG></P><P><FONT face="comic sans ms,sans-serif">Best For:</FONT> Startups, SMEs, and organizations with unpredictable workloads</P><P><FONT face="comic sans ms,sans-serif">Benefits:</FONT></P><UL><LI>No upfront commitment</LI><LI>Pay only for what you consume</LI><LI>Rapid scalability and flexibility</LI></UL><P><FONT face="comic sans ms,sans-serif">Considerations:</FONT></P><UL><LI>Requires cost governance</LI><LI>Expenses increase with scale</LI></UL><P><STRONG><EM>3. Cloud Platform Enterprise Agreement (CPEA)</EM></STRONG></P><P><FONT face="comic sans ms,sans-serif">Best For:</FONT> Large enterprises adopting multiple SAP BTP services</P><P><FONT face="comic sans ms,sans-serif">Benefits:</FONT></P><UL><LI>Prepaid cloud credits</LI><LI>Flexibility across SAP BTP services</LI><LI>Volume-based discounts</LI><LI>Centralized governance</LI></UL><P><FONT face="comic sans ms,sans-serif">Considerations:</FONT></P><UL><LI>Requires upfront financial commitment</LI><LI>Needs consumption planning</LI></UL><P><EM><STRONG>4. Subscription-Based Licensing</STRONG></EM></P><P><FONT face="comic sans ms,sans-serif">Best For:</FONT> Organizations with stable and predictable workloads</P><P><FONT face="comic sans ms,sans-serif">Benefits:</FONT></P><UL><LI>Predictable costs</LI><LI>Simplified budgeting</LI><LI>Guaranteed capacity</LI></UL><P><FONT face="comic sans ms,sans-serif">Considerations:</FONT></P><UL><LI>Less flexibility compared to consumption models</LI><LI>Potential risk of underutilization</LI></UL><P><STRONG><EM>5. RISE with SAP</EM></STRONG></P><P><FONT face="comic sans ms,sans-serif">Best For:</FONT> Organizations adopting SAP S/4HANA Cloud as part of digital transformation</P><P><FONT face="comic sans ms,sans-serif">Benefits:</FONT></P><UL><LI>Bundled services under a single contract</LI><LI>Simplified vendor management</LI><LI>Accelerated cloud adoption</LI></UL><P><FONT face="comic sans ms,sans-serif">Considerations:</FONT></P><UL><LI>Less granular pricing visibility</LI><LI>Best suited for SAP-centric landscapes</LI></UL><P><FONT size="4"><STRONG>Decision Matrix: Choosing the Right Model</STRONG></FONT></P><DIV><TABLE border="0" cellspacing="0" cellpadding="0"><TBODY><TR><TD><P><STRONG><EM>Business Scenario</EM></STRONG></P></TD><TD><P><STRONG><EM>Recommended Model</EM></STRONG></P></TD></TR><TR><TD><P>Learning and experimentation</P></TD><TD><P>Free Tier</P></TD></TR><TR><TD><P>Startups building their first integrations</P></TD><TD><P>Pay-As-You-Go</P></TD></TR><TR><TD><P>SMEs with growing integration needs</P></TD><TD><P>PAYG transitioning to CPEA</P></TD></TR><TR><TD><P>Enterprises adopting multiple BTP services</P></TD><TD><P>CPEA</P></TD></TR><TR><TD><P>Predictable, high-volume workloads</P></TD><TD><P>Subscription-Based Licensing</P></TD></TR><TR><TD><P>S/4HANA Cloud transformation initiatives</P></TD><TD><P>RISE with SAP</P></TD></TR><TR><TD><P>System integrators and consulting firms</P></TD><TD><P>PAYG for projects; CPEA for internal use</P></TD></TR></TBODY></TABLE></DIV><P><FONT size="4"><STRONG>Key Cost Drivers for SAP Integration Suite</STRONG></FONT></P><DIV><TABLE border="0" cellspacing="0" cellpadding="0"><TBODY><TR><TD><P><EM><STRONG>Cost Driver</STRONG></EM></P></TD><TD><P><STRONG><EM>Business Impact</EM></STRONG></P></TD></TR><TR><TD><P>Number of integrations</P></TD><TD><P>Influences runtime capacity</P></TD></TR><TR><TD><P>Message volume</P></TD><TD><P>Major contributor to consumption costs</P></TD></TR><TR><TD><P>API calls</P></TD><TD><P>Impacts API Management usage</P></TD></TR><TR><TD><P>B2B/EDI capabilities</P></TD><TD><P>Adds specialized costs</P></TD></TR><TR><TD><P>Number of environments (Dev, QA, Prod)</P></TD><TD><P>Increases consumption</P></TD></TR><TR><TD><P>Data transformation complexity</P></TD><TD><P>Affects processing requirements</P></TD></TR><TR><TD><P>High availability and scalability</P></TD><TD><P>Raises infrastructure costs</P></TD></TR><TR><TD><P>Security and compliance requirements</P></TD><TD><P>May increase operational overhead</P></TD></TR></TBODY></TABLE></DIV><P><FONT size="4"><STRONG>Real-World Case Studies</STRONG></FONT></P><P><STRONG><EM>Case Study 1: Startup Integrating SaaS Applications</EM></STRONG></P><P><FONT face="comic sans ms,sans-serif">Industry:</FONT> HR Technology Startup</P><P><FONT face="comic sans ms,sans-serif">Challenge:</FONT> Integrate a cloud-based HR platform with SAP S/4HANA for clients.</P><P><FONT face="comic sans ms,sans-serif">Solution</FONT>: Pay-As-You-Go model.</P><P><FONT face="comic sans ms,sans-serif">Implementation</FONT>:</P><UL><LI>Connected Salesforce, SAP S/4HANA, and SuccessFactors.</LI><LI>Leveraged API Management and Cloud Integration.</LI><LI>Scaled gradually based on customer demand.</LI></UL><P><FONT face="comic sans ms,sans-serif">Outcome</FONT>:</P><UL><LI>Zero upfront investment.</LI><LI>Faster time-to-market.</LI><LI>Controlled operational expenses.</LI></UL><P><FONT face="comic sans ms,sans-serif">Why PAYG Was Ideal:</FONT></P><UL><LI>Unpredictable workloads.</LI><LI>Need for agility and cost efficiency.</LI></UL><P><EM><STRONG>Case Study 2: Manufacturing Enterprise Modernizing Legacy Systems</STRONG></EM></P><P><FONT face="comic sans ms,sans-serif">Industry</FONT>: Global Manufacturing</P><P><FONT face="comic sans ms,sans-serif">Challenge</FONT>: Replace point-to-point integrations across SAP ECC, Ariba, and third-party logistics providers.</P><P><FONT face="comic sans ms,sans-serif">Solution</FONT>: Cloud Platform Enterprise Agreement (CPEA).</P><P><FONT face="comic sans ms,sans-serif">Implementation</FONT>:</P><UL><LI>Standardized enterprise integrations using SAP Integration Suite.</LI><LI>Enabled EDI and API-based partner connectivity.</LI><LI>Utilized BTP credits across multiple services.</LI></UL><P><FONT face="comic sans ms,sans-serif">Outcome</FONT>:</P><UL><LI>Reduced integration complexity.</LI><LI>Improved supply chain visibility.</LI><LI>Optimized costs through prepaid credits.</LI></UL><P><FONT face="comic sans ms,sans-serif">Why CPEA Was Ideal:</FONT></P><UL><LI>Large-scale, enterprise-wide adoption.</LI><LI>Need for flexibility across multiple BTP services.</LI></UL><P><STRONG><EM>Case Study 3: Retail Chain Managing Seasonal Demand</EM></STRONG></P><P><FONT face="comic sans ms,sans-serif">Industry</FONT>: Retail and E-Commerce</P><P><FONT face="comic sans ms,sans-serif">Challenge</FONT>: Handle fluctuating integration volumes during festive and seasonal peaks.</P><P><FONT face="comic sans ms,sans-serif">Solution</FONT>: Pay-As-You-Go model.</P><P><FONT face="comic sans ms,sans-serif">Implementation</FONT>:</P><UL><LI>Integrated SAP Commerce Cloud with logistics and payment gateways.</LI><LI>Scaled integrations during peak sales periods.</LI></UL><P><FONT face="comic sans ms,sans-serif">Outcome</FONT>:</P><UL><LI>Cost optimization during off-peak seasons.</LI><LI>Elastic scalability during high demand.</LI></UL><P><FONT face="comic sans ms,sans-serif">Why PAYG Was Ideal</FONT>:</P><UL><LI>Variable workloads and seasonal spikes.</LI></UL><P><STRONG><EM>Case Study 4: Banking Institution Requiring Predictable Costs</EM></STRONG></P><P><FONT face="comic sans ms,sans-serif">Industry</FONT>: Banking and Financial Services</P><P><FONT face="comic sans ms,sans-serif">Challenge</FONT>: Ensure secure, compliant, and stable integrations across core banking systems.</P><P><FONT face="comic sans ms,sans-serif">Solution</FONT>: Subscription-Based Licensing.</P><P><FONT face="comic sans ms,sans-serif">Implementation</FONT>:</P><UL><LI>Integrated SAP and non-SAP systems with strict governance.</LI><LI>Ensured regulatory compliance and high availability.</LI></UL><P><FONT face="comic sans ms,sans-serif">Outcome</FONT>:</P><UL><LI>Predictable budgeting and financial planning.</LI><LI>Stable, mission-critical operations.</LI></UL><P><FONT face="comic sans ms,sans-serif">Why Subscription Was Ideal</FONT>:</P><UL><LI>Consistent transaction volumes.</LI><LI>Strong compliance requirements.</LI></UL><P><STRONG><EM>Case Study 5: Enterprise Migrating to SAP S/4HANA Cloud</EM></STRONG></P><P><FONT face="comic sans ms,sans-serif">Industry</FONT>: Professional Services</P><P><FONT face="comic sans ms,sans-serif">Challenge</FONT>: Transform legacy systems while migrating to SAP S/4HANA Cloud.</P><P><FONT face="comic sans ms,sans-serif">Solution</FONT>: RISE with SAP.</P><P><FONT face="comic sans ms,sans-serif">Implementation</FONT>:</P><UL><LI>Leveraged pre-packaged integrations and clean-core principles.</LI><LI>Enabled seamless connectivity across cloud applications.</LI></UL><P><FONT face="comic sans ms,sans-serif">Outcome</FONT>:</P><UL><LI>Simplified vendor and contract management.</LI><LI>Accelerated digital transformation.</LI></UL><P><FONT face="comic sans ms,sans-serif">Why RISE with SAP Was Ideal:</FONT></P><UL><LI>Unified approach to ERP modernization and integration.</LI></UL><P><FONT size="4"><STRONG>A Typical Adoption Journey</STRONG></FONT></P><P>Most organizations follow this path:</P><P>Free Tier → Pay-As-You-Go → CPEA or Subscription → RISE with SAP</P><P>This approach enables businesses to:</P><UL><LI>Validate use cases</LI><LI>Optimize investments</LI><LI>Scale efficiently</LI><LI>Reduce financial risks</LI></UL><P><FONT size="4"><STRONG>Essential Questions to Ask SAP or Partners</STRONG></FONT></P><P>Before selecting a commercial model, consider asking:</P><OL><LI>What metrics determine Integration Suite costs?</LI><LI>Which capabilities are included in the license?</LI><LI>How are non-production environments billed?</LI><LI>Are there volume discounts available?</LI><LI>What governance tools exist for cost monitoring?</LI><LI>Can the commercial model be converted later?</LI><LI>What is the estimated total cost of ownership over three years?</LI><LI>How does pricing scale as the organization grows?</LI></OL><P><FONT size="4"><STRONG>Recommended Resources</STRONG></FONT></P><UL><LI><A href="https://discovery-center.cloud.sap/" target="_self" rel="nofollow noopener noreferrer">SAP Discovery Center&nbsp;</A></LI><LI><A href="https://discovery-center.cloud.sap/estimator/?commercialModel=btpea" target="_self" rel="nofollow noopener noreferrer">SAP BTP Pricing Calculator</A></LI><LI><A href="https://help.sap.com/docs" target="_self" rel="noopener noreferrer">SAP Help Portal</A></LI><LI><A href="https://community.sap.com/" target="_self">SAP Community Blogs and Q&amp;A</A></LI><LI><A href="https://learning.sap.com/" target="_self" rel="noopener noreferrer">SAP Learning Hub and openSAP</A></LI><LI><A href="https://www.sap.com/india/partners.html" target="_self" rel="noopener noreferrer">Authorized SAP Partners and Account Executives</A></LI></UL><P><FONT size="4"><STRONG>Key Takeaways</STRONG></FONT></P><UL><LI>Pay-As-You-Go is a licensing model—not a license-free option.</LI><LI>CPEA provides flexibility and cost optimization for enterprises.</LI><LI>Subscription models offer predictable costs for stable workloads.</LI><LI>RISE with SAP simplifies ERP-led transformations.</LI><LI>Architects must align technical architecture with commercial strategy.</LI><LI>Understanding licensing early prevents costly redesigns later.</LI></UL><P><FONT size="4"><STRONG>Conclusion</STRONG></FONT></P><P>While developers benefit from extensive technical guidance, businesses and architects often lack clarity around licensing and pricing. By understanding SAP Integration Suite’s commercial models, organizations can make informed decisions that align technology investments with business goals.</P><P>Selecting the right licensing model ensures scalability, cost efficiency, and long-term success in the cloud integration journey.</P><P><FONT size="4"><STRONG>Call to Action</STRONG></FONT></P><P>Have you implemented SAP Integration Suite using PAYG, CPEA, Subscription, or RISE with SAP? Share your experiences and insights in the comments to help the SAP Community learn and grow together.</P><P><SPAN>Thank you for reading!</SPAN></P><P><SPAN>Connect in LinkedIn :&nbsp;<A href="https://www.linkedin.com/in/naveen-kumar-a75452a2/" target="_self" rel="nofollow noopener noreferrer">Naveen Kumar</A>&nbsp;</SPAN></P><P><STRONG>Disclaimer</STRONG>:<BR />This article reflects personal insights and is intended for educational and informational purposes only. It does not represent the official position of SAP. Pricing, licensing, and commercial models are subject to change and may vary by region and customer agreement. For the most accurate and up-to-date information, please consult SAP directly or an authorized SAP partner. SAP and other SAP products mentioned herein are trademarks or registered trademarks of SAP SE in Germany and other countries.</P> 2026-04-16T11:16:02.182000+02:00 https://community.sap.com/t5/developer-news/sap-developer-news-for-april-16th-2026/ba-p/14375653 SAP Developer News for April 16th, 2026 2026-04-16T21:00:00.018000+02:00 qmacro https://community.sap.com/t5/user/viewprofilepage/user-id/53 <H3 id="toc-hId-1923315845"><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FmJrmidot-G4%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DmJrmidot-G4&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FmJrmidot-G4%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="600" height="337" scrolling="no" title="SAP Developer News" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></H3><H3 id="toc-hId-1726802340">ITEMS</H3><P><STRONG><SPAN>UX Innovation Day in Silicon Valley on 11 June</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>Event page&nbsp;</SPAN><A href="https://events.sap.com/us-ux-innovation-day-siliconvalley-2026/en_us/home.html" target="_blank" rel="noopener noreferrer"><SPAN>https://events.sap.com/us-ux-innovation-day-siliconvalley-2026/en_us/home.html</SPAN></A><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><STRONG><SPAN>SAP BTP ABAP Environment – Pre-Upgrade Option for Release 2605</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>Blog post&nbsp;</SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-pre-upgrade-option-for-release-2605/ba-p/14347147" target="_blank"><SPAN>https://community.sap.com/t5/technology-blog-posts-by-sap/sap-btp-abap-environment-pre-upgrade-option-for-release-2605/ba-p/14347147</SPAN></A><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><STRONG><SPAN>XML Annotations: The Essentials Before Adapting Documentation Samples to Your Project</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>Mio’s blog post&nbsp;</SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-members/xml-annotations-the-essentials-before-adapting-documentation-samples-to/ba-p/14369241" target="_blank"><SPAN>https://community.sap.com/t5/technology-blog-posts-by-members/xml-annotations-the-essentials-before-adapting-documentation-samples-to/ba-p/14369241</SPAN></A><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>OData Deep Dive mission&nbsp;</SPAN><A href="https://developers.sap.com/mission.odata-deep-dive.html" target="_blank" rel="noopener noreferrer"><SPAN>https://developers.sap.com/mission.odata-deep-dive.html</SPAN></A><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>OData Deep Dive rewrite blog post&nbsp;</SPAN><A href="https://qmacro.org/blog/posts/2026/02/02/odata-deep-dive-rewrite-in-the-open/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>https://qmacro.org/blog/posts/2026/02/02/odata-deep-dive-rewrite-in-the-open/</SPAN></A><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><STRONG><SPAN>Edge Integration Cell APIs and Cloud Integration AI-assisted error resolution</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>Edge Integration Cell APIs:&nbsp;</SPAN><A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/local-odata-api-access-for-edge-integration-cell?locale=en-US" target="_blank" rel="noopener noreferrer"><SPAN>https://help.sap.com/docs/cloud-integration/sap-cloud-integration/local-odata-api-access-for-edge-integration-cell?locale=en-US</SPAN></A><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>AI-assisted error resolution:&nbsp;</SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/analyze-message-processing-errors-with-ai-f27f95d7b90b4f13aea22b399418b702?locale=en-US" target="_blank" rel="noopener noreferrer"><SPAN>https://help.sap.com/docs/integration-suite/sap-integration-suite/analyze-message-processing-errors-with-ai-f27f95d7b90b4f13aea22b399418b702?locale=en-US</SPAN></A><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><STRONG><SPAN>DYK #12 AI Launchpad Leaderboard</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>The Model Library topic in the SAP Help Portal&nbsp;</SPAN><A href="https://help.sap.com/docs/ai-launchpad/sap-ai-launchpad/model-library" target="_blank" rel="noopener noreferrer"><SPAN>https://help.sap.com/docs/ai-launchpad/sap-ai-launchpad/model-library</SPAN></A><SPAN>&nbsp;</SPAN><SPAN>&nbsp;</SPAN></LI></UL><H3 id="toc-hId-1530288835">CHAPTER TITLES</H3><P><SPAN>00:00 Intro</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>00:07&nbsp;UX Innovation Day in Silicon Valley on 11 June</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>01:00&nbsp;SAP BTP ABAP Environment – Pre-Upgrade Option for Release 2605</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>02:00&nbsp;</SPAN><SPAN>XML Annotations: The Essentials Before Adapting Documentation Samples to Your Project</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>03:16&nbsp;Edge Integration Cell APIs and Cloud Integration AI-assisted&nbsp;error resolution</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>04:25&nbsp;DYK #12 AI Launchpad Leaderboard</SPAN><SPAN>&nbsp;</SPAN></P><H3 id="toc-hId-1333775330"><SPAN>TRANSCRIPT</SPAN></H3><P>[INTRO]<BR />This is the SAP Developer News for April the 16th, 2026.</P><P>[DJ]<BR />If you're in the Silicon Valley area in June and are interested in the intersection between AI and UX, then there's an event just for you. It's on the 11th of June at the SAP AppHaus in Palo Alto, and it's an in-person event only. It's for developers, architects, and technical consultants, and it's all about the AI functionality being built into the SAP Fiori elements framework. There's AI for business users and AI for application developers. The event page has an agenda for the day, which is currently tentative, but it gives us a good idea of the format and content. There's also a link on there for registration. Anyway, check it out. Link in the description.</P><P>[Mamikee]<BR />We have an important update for SAP BTP ABAP environment users. We're offering a free pre-upgrade option for release 2605, giving customers and partners the chance to test their existing applications ahead of the standard upgrade, which is planned for May 16th and 17th. Now some of the key milestones have already passed. Planned new features were announced on April April 13th, and pre-upgraded systems are scheduled for upgrade on April 17th, which means teams already participating should now be focused on regression testing and validating their custom-built apps. Now, looking ahead, Hot Fix Collection 2 is planned for April 30th, and any issues found during testing should be reported by May 1st using component BC-CP-ABA. Now, the goal is simple. help make the upgrade a no-event and avoid day one surprises. You can read more in the link below.</P><P>[DJ]<BR />Fiori elements based UIs are great, but sometimes it's hard for us to grok how they can be controlled and configured, which is mostly through annotations, which are organized in vocabularies, expressed in metadata, which is usually in the form of XML. So any help is welcome. And in that context, we wanted to point you to a great blog post by SAP community member Mio Yasutake, who takes time to explain these topics in great detail, how things fit together based upon samples and documentation for UI5 and in the context of CAP and RAP-based services. There's lots of detail and it's well worth a read. Thanks Mio! Also if you want more detail to complement this then we have the OData deep dive mission over on the tutorial navigator and in there there are specific tutorials on metadata vocabularies and annotations ready to go as well. Happy learning!</P><P>[Antonio]<BR />Hola, SAP Developers! Two quick updates for Edge Integration Cell and Cloud Integration users. First, the local OData APIs for Edge Integration Cell just got better. You can now authenticate using Client ID and Client Secret. More secure, easy to automate. Now, a quick reminder that there are many APIs in Edge Integration Cell that you can use. Monitoring APIs, for example, to track message processing. and management APIs for message stores, data stores, JMS brokers, and variables. These are perfect for building custom dashboards or for automating operations or integrating with your existing monitoring tools. Now, in Cloud Integration, we have AI-assisted error resolution. When your integration flow fails, you can now use AI to analyze the error, get root cause suggestions, and even get remediation steps. So it's like having an integration buddy next to you. which can save time debugging and gets you back on track faster. So check the links in the description for full documentation on both features. ¡Hasta luego!</P><P>[Nora]<BR />Did you know that you can compare foundation models right in AI Launchpad? So just jump over to Generative AI Hub in your AI Launchpad and open the model library. And then here you can click on Leaderboard. And now you see all the models that we have available here. and over here you can see the different scores so the HELM score for example tells you how well the model performed in a multiple choice exam across a variety of topics the chatbot arena score tells you how well the model performed in a head-to -head against different AI models and then the AIRBench refusal rate and the AIRBench discrimination bias refusal rate tells you how well the model is handling harmful or biased requests and then all the way over here you have the output and input token cost and the context window size. Now this really helped me to find the right model for my use case depending on cost and context window size and performance overall. I honestly usually don't go to the leaderboard, I head directly to the chart because here you can very easily compare the models.</P><P>&nbsp;</P> 2026-04-16T21:00:00.018000+02:00 https://community.sap.com/t5/integration-blog-posts/q1-2026-product-highlights-sap-integration-suite/ba-p/14376750 Q1/2026 Product Highlights - SAP Integration Suite 2026-04-17T10:42:48.013000+02:00 MaiaraEllwanger https://community.sap.com/t5/user/viewprofilepage/user-id/58 <P>Welcome to another quarterly recap of the latest released features in SAP Integration Suite! The new capabilities in Q1/2026 focus on better operations and smoother eventing for integration practitioners who build, run, and troubleshoot integrations every day. <SPAN>&nbsp;</SPAN>Enjoy the highlights and check the linked docs and demos for how-to details and the <A href="https://roadmaps.sap.com/board?PRODUCT=000D3A47875C1EDB98A8A910864AC24B&amp;PRODUCT=73554900100800003241&amp;range=2026Q1-2026Q1#Q1%202026" target="_blank" rel="noopener noreferrer">road map</A> for the full list.</P><H1 id="toc-hId-1665181156"><SPAN>Enhanced Edition is here</SPAN></H1><P><SPAN>SAP Integration Suite, enhanced edition helps move AI and agentic AI from pilots to production by providing governed, real-time connectivity, low-code developer tools, and AI-driven operations (Text-to-Flow, Script Optimization, API Anomaly Detection, API Traffic Prediction, plus connectors, event mesh, Document AI, alerting, and transport management). It reduces integration debt, enables secure agent actions across cloud and on-prem systems, and creates reusable building blocks for faster, repeatable AI value. </SPAN></P><P><SPAN>Accelerate your AI initiatives and make them enterprise-ready, get more details in the <A href="https://discovery-center.cloud.sap/serviceCatalog/integration-suite/?commercialModel=subscription&amp;tab=service_plan&amp;region=all" target="_blank" rel="noopener nofollow noreferrer">SAP Discovery Center</A>. </SPAN></P><H1 id="toc-hId-1468667651"><SPAN>Event-driven Integration</SPAN></H1><H2 id="toc-hId-1401236865"><SPAN>Discovery and publication of advanced event mesh events in the Developer Hub</SPAN></H2><P><SPAN>Content administrators can discover and publish Advanced Event Mesh events directly in the Developer Hub, enabling events to be exposed as event products and making it easier for application developers to search and find relevant events. </SPAN><SPAN>To use it, you create a destination to connect SAP Integration Suite, advanced event mesh to the Developer Hub; once connected, the business system appears in the Developer Hub for discovery and publication.</SPAN></P><P><SPAN>For more detailed instructions, check the documentation: <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/discover-and-publish-events-from-advanced-event-mesh-in-developer-hub?locale=en-US" target="_blank" rel="noopener noreferrer">Discover and Publish Events from Advanced Event Mesh in Developer Hub.</A></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="AEM Events Developer Hub.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399427iD4BCB0167EB49333/image-size/large?v=v2&amp;px=999" role="button" title="AEM Events Developer Hub.png" alt="AEM Events Developer Hub.png" /></span></SPAN></P><P>&nbsp;</P><H2 id="toc-hId-1204723360"><SPAN>Migration support from SAP Event Mesh to SAP Integration Suite, advanced event mesh</SPAN></H2><P><SPAN>This update provides technical and process-oriented support to help customers migrate from SAP Event Mesh (default plan) to SAP Integration Suite, advanced event mesh, enabling organizations to move their event-driven architectures to a more powerful, feature-rich platform. The guide targets customers already using the SAP Event Mesh default plan and outlines steps to expand their event-based architecture.&nbsp;</SPAN><SPAN>Read the guide: <A href="https://help.sap.com/docs/event-mesh/migration-from-sap-event-mesh-to-sap-integration-suite-advanced-event-mesh-ce3b19e530d44cbe9409f709d05a242a/overview?locale=en-US" target="_blank" rel="noopener noreferrer">Migration From SAP Event Mesh to SAP Integration Suite, Advanced Event Mesh</A>.</SPAN></P><H1 id="toc-hId-879127136"><SPAN>Process Integration</SPAN></H1><H2 id="toc-hId-811696350"><SPAN>Valkey support for Edge Integration Cell</SPAN></H2><P>The Edge Integration Cell capability in SAP Integration Suite now supports Valkey as an alternative datastore option alongside Redis and HANA DB. This option is available as selectable installation supporting versions 8.0-8.2 and allows administrators to choose Valkey for deployments helping reduce total cost of ownership.</P><P>For the steps and prerequesites, see: <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/deploy-edge-integration-cell-solution" target="_blank" rel="noopener noreferrer"><SPAN>Deploy the Edge Integration Cell Solution</SPAN></A></P><H2 id="toc-hId-615182845"><SPAN>Monitor Message Processing on SAP Focused Run and SAP Cloud ALM</SPAN></H2><P>Users can monitor message processing from Edge Integration Cell using a push-based approach to send logs to SAP Focused Run (FRUN) and SAP Cloud ALM (CALM). This enables centralized monitoring of multiple Edge Integration Cell runtimes within a single application, lets you configure alerts based on message processing log status, and supports monitoring of Edge Integration Cell message processing logs in SAP Focused Run even during offline scenarios.</P><P>See <SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/monitor-message-processing-on-frun" target="_blank" rel="noopener noreferrer">Monitor Message Processing on SAP Focused Run and SAP Cloud ALM </A></SPAN>for more information.</P><H2 id="toc-hId-418669340"><SPAN>Message queue management: extension and filtering of scenario details in the message queue monitor</SPAN></H2><P>The message queue monitor now displays scenario-specific attributes, such as Sender, Receiver, Application Message Type, Application Message ID, and Correlation ID, which can be enabled in the Messages table settings and used as filter criteria.</P><P>This feature lets you narrow messages more efficiently and quickly identify problematic entries with immediate context, reducing mean time to resolution by allowing direct filtering to relevant messages, enabling more precise troubleshooting and root-cause analysis, cutting operational noise by surfacing only the messages that matter, improving auditing and compliance with visible searchable metadata, and simplifying collaboration and handover between operations, support, and development teams.&nbsp;<SPAN>Get started: <A href="https://help.sap.com/docs/cloud-integration/sap-cloud-integration/managing-messages-stored-in-queues" target="_blank" rel="noopener noreferrer">Managing Messages Stored in Queues</A></SPAN></P><H2 id="toc-hId-222155835"><SPAN>Support for parameterized mappings for the adapter type</SPAN></H2><P>The import options from SAP Process Orchestration into SAP Integration Suite - Cloud Integration have been extended to support parameters in message mappings for the adapter category, enabling you to import PI/PO message mappings that include adapter-type parameters; migration tooling and standalone message mapping import now accept mapping objects with the Adapter Type parameter category of type Import, which preserves adapter-specific parameterization, reduces manual adjustments and rework during migration, improves fidelity of migrated mappings, and accelerates onboarding and troubleshooting by maintaining runtime behavior tied to adapter parameters. See documentation:&nbsp;<SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/developing-message-mapping-as-artifact#import-a-message-mapping-from-enterprise-services-repository-(esr)" target="_blank" rel="noopener noreferrer">Import a Message Mapping from Enterprise Services Repository (ESR)</A></SPAN></P><H1 id="toc-hId--103440389"><SPAN>Connectivity Updates</SPAN></H1><H2 id="toc-hId-176383182"><SPAN>Customer-managed cloud connectors</SPAN></H2><P>The Edge Integration Cell runtime now supports using a customer-managed external SAP Cloud Connector instead of the built-in, SAP-managed connector, allowing organizations to deploy the connector in a network zone that best fits their infrastructure and security requirements. This feature adds deployment flexibility, improves security controls, enables additional traffic inspection capabilities, and helps meet infrastructure and compliance needs. See configuration steps: <SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/configure-external-cloud-connector-for-edge-integration-cell" target="_blank" rel="noopener noreferrer">Configure an External Cloud Connector for Edge Integration Cell</A></SPAN></P><P>Additionally, users can now add and initialize an Edge Node with an external Cloud Connector through Edge Lifecycle Management. See how: <SPAN><A href="https://help.sap.com/docs/edge-lifecycle-management/documentation/initializing-edge-node-with-external-cloud-connector" target="_blank" rel="noopener noreferrer">Initializing an Edge Node with External Cloud Connector</A></SPAN></P><H2 id="toc-hId--20130323"><SPAN>Latest adapters</SPAN></H2><P><SPAN>The list of released adapter in Q1/2026 includes: </SPAN></P><UL><LI><SPAN><A href="https://hub.sap.com/package/BambooHRAdapterforSAPIntegrationSuite/overview" target="_blank" rel="noopener noreferrer">BambooHR adapter</A>:&nbsp;Connect to BambooHR to access APIs related to employee, organizational, time off data etc.</SPAN></LI><LI><SPAN><SPAN><A href="https://hub.sap.com/package/ZendeskAdapterforSAPIntegrationSuite/overview" target="_blank" rel="noopener noreferrer">Zendesk adapte</A>r:&nbsp;</SPAN></SPAN><SPAN>Offers a comprehensive set of Ticketing CRUD operations for various entities such as Tickets, Attachments, Requests, Tags, etc. The adapter is designed to receive and process data from an integration flow in SAP Integration Suite and facilitate communication with Zendesk application (external) using REST-based APIs.</SPAN></LI><LI><SPAN><SPAN><A href="https://hub.sap.com/package/MicrosoftOutlookAdapterforSAPIntegrationSuite/overview" target="_blank" rel="noopener noreferrer">Microsoft 365 Outlook adapter</A>:&nbsp;Enables seamless integration between Microsoft Outlook and SAP Integration Suite by improving communication and automating workflows between the two platforms. Available as a Sender and Receiver adapter. <span class="lia-unicode-emoji" title=":movie_camera:">🎥</span> <A title="MS 365 Outlook adapter demo" href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_ejk0fwba" target="_blank" rel="noopener nofollow noreferrer">Watch the demo</A>.&nbsp;</SPAN></SPAN></LI><LI><SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/oftp-adapter-for-edge-integration-cell" target="_blank" rel="noopener noreferrer">OFTP2 adapter</A>:&nbsp;Use the Odette File Transfer Protocol (OFTP) adapter to exchange EDI and business files with partners on your Edge Integration Cell.</SPAN></LI><LI><SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/nfs-adapter" target="_blank" rel="noopener noreferrer">NFS File adapter</A>:&nbsp;</SPAN><SPAN>Enables connectivity to NFS server facilitating read and write operations for files on your Edge Integration Cell. &nbsp;<span class="lia-unicode-emoji" title=":movie_camera:">🎥</span> <A title="NFS file adapter demo" href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_p9sxtou0" target="_blank" rel="noopener nofollow noreferrer">Watch the demo</A></SPAN><SPAN>.</SPAN></LI></UL><H2 id="toc-hId--216643828"><SPAN>Updated data center availability</SPAN></H2><P><SPAN>The new data center availability options for SAP Integration Suite include:&nbsp;</SPAN><SPAN>Australia (Sydney) on SAP infrastructure, Japan (Tokyo) and USA on an SAP-hosted infrastructure, and the United Kingdom through Microsoft Azure.</SPAN></P><P><SPAN>---</SPAN></P><H3 id="toc-hId--706560340"><SPAN>Learn more</SPAN></H3><P><SPAN>Want a sneak peek into what else is in store for SAP Integration Suite in 2026? Watch this walkthrough:</SPAN></P><P><SPAN><A title="Video: SAP Integration Suite in 2026" href="https://www.youtube.com/live/kFynsigf99o?si=q_Q6eIgNjUiZRVIb&amp;t=1376" target="_self" rel="nofollow noopener noreferrer"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="1770104250710.jpeg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399434i1740E78662ABC8A2/image-size/medium?v=v2&amp;px=400" role="button" title="1770104250710.jpeg" alt="1770104250710.jpeg" /></span></A></SPAN></P><P>&nbsp;What are the key innovation you're looking forward to in 2026? Let me know in the comments!</P> 2026-04-17T10:42:48.013000+02:00 https://community.sap.com/t5/supply-chain-management-blog-posts-by-sap/sap-cloud-integration-ci-for-sap-ibp-hpa-integration-a-real-world/ba-p/14377032 SAP Cloud Integration (CI) for SAP IBP HPA integration: A real-world implementation case study 2026-04-17T20:37:37.846000+02:00 Vikash_Chander https://community.sap.com/t5/user/viewprofilepage/user-id/2286716 <P>In one of the previous blog post, <A href="https://community.sap.com/t5/supply-chain-management-blog-posts-by-sap/sap-ibp-new-integration-option-introducing-sap-cloud-integration-from-btp-s/ba-p/14169516" target="_blank"><STRONG>SAP Cloud Integration</STRONG></A> was introduced as new integration option for SAP IBP. Subsequent <A href="https://community.sap.com/t5/supply-chain-management-blog-posts-by-sap/ibp-integration-with-sap-integration-suite-your-one-stop-reference/ba-p/14343558" target="_blank">blog posts</A> covered technical topics for creating integration flows based on SAP delivered packages and flows for different integration scenarios. These blog posts in addition to highlighting why organizations should consider SAP CI as part of their IBP integration strategy, covered fundamental set-up and configuration steps for using it for integrating SAP IBP with S/4 Hana Cloud.</P><P>In this blog, we explore a real-world example of an organization using Cloud Integration to overcome complex integration challenges for their IBP HPA implementation. We share details of challenges, key architectural decisions, and lessons learned from this complex supply chain planning implementation. This blog highlights a proven integration approach that offers valuable learnings for organizations navigating similar challenges.</P><P><STRONG>Integration challenges: Distributed landscape</STRONG></P><P>The organization in focus like other large manufacturing organizations operates an extensive global supply chain. Their landscape includes:</P><UL><LI>Multiple ERP system distributed globally</LI><LI>Large product portfolio with complex supply chain spread across locations using different systems</LI></UL><P>The key challenge was to integrate data from multiple SAP and Non-SAP systems. The integration approach needs to be flexible enough to support multiple source system integration with SAP IBP.</P><P><STRONG>Key decision: Cloud Integration or Real Time Integration</STRONG></P><P>One of the most critical decisions in any IBP implementation is to choose the right integration tool for IBP. &nbsp;From release 2508 onwards, RTI and SAP CI are the two integration tools available to integrate SAP IBP HPA with SAP S4 Hana private cloud.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Fig 1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399558i7F291FB734592E59/image-size/large?v=v2&amp;px=999" role="button" title="Fig 1.png" alt="Fig 1.png" /></span></P><P>&nbsp;</P><P>The sample customer’s implementation team made an early decision to go with a standalone CI integration approach for IBP. Some of the drivers for this decision were:</P><UL><LI>Cloud Integration works well with all SAP and non-SAP ERP systems, compared to RTI which is restricted only to S/4HANA Private edition</LI><LI>Readily available Cloud Integration expertise within the organization</LI><LI>Operational planning is carried out in ERP system, ruling out need for Order based planning in IBP</LI><LI>Business followed monthly planning cycle, with delta data load planned daily</LI></UL><P>Additionally, the availability of prepackaged reusable assets for SAP Cloud Integration supports accelerated implementation and reduces time to value significantly. It provides comprehensive connectivity options for diverse landscape, and it being under active development from SAP keeps your integration architecture future ready. Its web-based centralized monitoring and error handling capabilities help in reducing the overall maintenance cost. Because of these inherent advantages of SAP CI, the implementation team decided to go with standalone SAP CI integration architecture.</P><P>As real-time data sync capability was not needed, RTI didn’t offer any additional business value in comparison to CI in this scenario. However, depending on your business needs, Operational planning (OBP) in IBP and real time sync capabilities could be essential, in that case CI can be used in conjunction with RTI. As per SAP guidelines, integration architecture can utilize both the integration technologies following way:</P><UL><LI>RTI used for integrating master data and order data from S/4 Hana Private edition</LI><LI>SAP Cloud Integration (CI) used for all other integration scenarios such as Key Figures or other non-standard objects.</LI></UL><P>Following SAP help portal page helps you find right integration tool for your business needs: <A href="https://help.sap.com/docs/SAP_INTEGRATED_BUSINESS_PLANNING/da797ae2bf6246d58abd417f24915d55/a242fc929e55411cb8720fd717034f42.html?version=LATEST&amp;locale=en-US&amp;state=PRODUCTION" target="_blank" rel="noopener noreferrer">Finding the Right Integration Tool | SAP Help Portal</A></P><P><STRONG>Integration design philosophy: keep interfaces “Lean” and “Scalable”</STRONG></P><P>An important contributing factor to the successful implementation of CI for SAP IBP was to keep interfaces simple. The customer's implementation team followed a clear guiding principle that Cloud Integration (CI) should be used only for transporting data from one system to another. It should not be used for deriving any business logic. Cloud Integration (CI) is best used for:</P><UL><LI>Data transportation</LI><LI>Data format transformation and technical validation</LI><LI>Security handling</LI></UL><P>Business rules, process logic, and calculations were handled in the source or target system. This approach of preprocessing data in source or target system, made sure CI flows are simple, maintainable and reusable.</P><P><STRONG>Preprocessing of data in source system</STRONG>:</P><P>To keep the core and IBP Add-on clean on the S/4 Hana, the implementation team decided to use extended CDS views for data preprocessing in S/4 Hana. Cloud integration flows read data directly from CDS views, avoiding modification of extractors and therefore sticking to clean core best practices.</P><P>How it works: Multi layered CDS views were created for preprocessing data in S/4 Hana:</P><OL><LI>Reuse layer CDS views: Built on IBP add-on staging tables and raw tables (for additional data), this layer provided filtered data. As these CDS view also included data from raw tables, any custom data fields not available in IBP add-on staging tables were captured in these CDS views</LI><LI>Consumption layer CDS views: This is primarily used for renaming S/4 fields to IBP fields. Reuse layer CDS views served as input for these CDS views. CI flows read data directly from these CDS views.</LI></OL><P>Above approach along with <A href="https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-sap/cds-based-data-extraction-part-ii-delta-handling/ba-p/13425761" target="_blank">Change Data Capture (CDC) capability</A> for CDS extraction allows delta loads for master data and S/4 Hana execution transaction data.</P><P><STRONG>Reusable integration flows in CI:</STRONG></P><P>SAP CI provides prepackaged reusable integration flows, that can be used to integrate all master data and transaction data types with minimal configuration changes. For the sample customer, data integration is executed by running a single prepackaged reusable CI iflow. One reusable integration flow handles all integration scenarios – all master data and key figures, with the help of flexible parameters. These parameters define:</P><UL><LI>Source CDS view to read in S/4 Hana</LI><LI>Target Master data and Key figures in IBP</LI><LI>Transfer mode: delta or full load</LI></UL><P>By sticking to preprocessing within the source system using CDS views and integrating using reusable flow, solution is flexible to accommodate future requirements. Any future business requirements can be handled by extending CDS views in the source system, avoiding any changes in the integration layer.</P><P><STRONG>Integration with non-SAP system</STRONG>:</P><P>To integrate non-SAP ERP systems, data from multiple ERP systems is first integrated into a Data warehousing system. In Data warehousing system similar CDS view dependent process is used to preprocess data and then a reusable CI flow is used to pull data into IBP. This unified approach means consistent data structure regardless of the source system type.</P><P><STRONG>Back integration to S4 Hana system:</STRONG></P><P>IBP add-on staging tables enable a fire and forget approach for integrating planning output data from IBP to S/4 Hana. CI delivers data to S/4 IBP add-on tables and S/4 process them independently. &nbsp;</P><P>With this lean integration approach, figure below shows high level data flow between different systems:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Fig 2.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399551iA91ECC81136E7055/image-size/large?v=v2&amp;px=999" role="button" title="Fig 2.png" alt="Fig 2.png" /></span></P><P>&nbsp;</P><P>&nbsp;<STRONG>Key takeaways: </STRONG><SPAN>Some of the key learnings from this successful implementation of CI integration are:</SPAN></P><UL><LI>Evaluating business requirements to select the right integration tool for your implementation. Depending on specific scenarios, CI only integration strategy can be effective.</LI><LI>Keep integration lean and focus on data transport only. Push transformation and business logic in source and target systems</LI><LI>Availability of prepackaged integration flow helps in accelerated implementation, and results in scalable and low maintenance integration solution</LI></UL><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P> 2026-04-17T20:37:37.846000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/cloud-integration-with-translation-hub/ba-p/14377520 Cloud Integration with Translation Hub 2026-04-19T12:53:57.332000+02:00 PriyankaChak https://community.sap.com/t5/user/viewprofilepage/user-id/3763 <H1 id="toc-hId-1665208932"><STRONG>Introduction:</STRONG></H1><P><SPAN>In this blog post, I will demonstrate how to connect Cloud Integration with Translation Hub. As a use case, consider a scenario where a sender system submits an order request. If the order creation fails, the system expects the error message to be returned in both English and Japanese.</SPAN></P><H1 id="toc-hId-1468695427">&nbsp;</H1><H1 id="toc-hId-1272181922"><SPAN>Translation Hub:</SPAN></H1><P><SPAN>For an overview of the SAP Translation Hub service and its features, refer to </SPAN><A href="https://discovery-center.cloud.sap/serviceCatalog/sap-translation-hub?tab=featuretab&amp;region=all" target="_blank" rel="noopener nofollow noreferrer">discovery center.</A></P><H1 id="toc-hId-1075668417">&nbsp;</H1><H1 id="toc-hId-879154912"><SPAN>Step 1:</SPAN></H1><P><SPAN>Create an instance for a service named SAP Translation Hub (technical name: document-translation) and generate its corresponding service key.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pic1.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399775i6434474F6C508544/image-size/large?v=v2&amp;px=999" role="button" title="pic1.png" alt="pic1.png" /></span></SPAN></P><P><SPAN>From the service key, retrieve ‘<FONT color="#0000FF">documenttranslation.url’</FONT>, ‘<FONT color="#0000FF">uaa.clientid</FONT><STRONG>’, ‘</STRONG><FONT color="#0000FF">uaa<STRONG>.</STRONG>clientsecret</FONT><STRONG>’ </STRONG>and ‘<FONT color="#0000FF">uaa.url</FONT>’, which will be later used in integration scenario.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pic2.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399776i1898C3ED34A2F86A/image-size/large?v=v2&amp;px=999" role="button" title="pic2.png" alt="pic2.png" /></span></SPAN></P><H2 id="toc-hId-811724126"><SPAN>Step 2:</SPAN></H2><P><SPAN>Explore document translation api at </SPAN><A href="https://api.sap.com/api/documenttranslation/tryout" target="_blank" rel="noopener noreferrer"><SPAN>Business Accelerator Hub</SPAN></A><SPAN>.</SPAN></P><P><SPAN>For the model parameter, two values are supported: default and llm. The default model uses SAP-trained Neural Machine Translation (NMT). For a list of supported languages, refer to the SAP Translation Hub documentation:&nbsp;</SPAN><A href="https://help.sap.com/docs/translation-hub/sap-translation-hub/supported-languages-6854bbb1bd824ffebc3a097a7c0fd45d?locale=en-US" target="_blank" rel="noopener noreferrer">Supported Languages</A></P><P><SPAN>The</SPAN><SPAN> llm</SPAN><SPAN>&nbsp;falls under the generative AI category and can be used when a target language is not supported by the SAP-trained NMT model. For example, to translate text into Bengali.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pic3.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399777iB96E556D7CB0E59B/image-size/large?v=v2&amp;px=999" role="button" title="pic3.png" alt="pic3.png" /></span></SPAN></P><H1 id="toc-hId-486127902">&nbsp;</H1><H1 id="toc-hId-289614397"><SPAN><STRONG>Cloud Integration:</STRONG></SPAN></H1><H2 id="toc-hId-222183611"><SPAN>Step 1:</SPAN></H2><P><SPAN>Create a security material of type ‘OAuth2 Client Credentials’.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Pic4.png" style="width: 916px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399778iC98E1EDD4AFDC821/image-size/large?v=v2&amp;px=999" role="button" title="Pic4.png" alt="Pic4.png" /></span></SPAN></P><H2 id="toc-hId-25670106"><SPAN>Step 2:</SPAN></H2><P><SPAN>Design the iFlow as illustrated below.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pic5.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399779iC2B551D5272EB61B/image-size/large?v=v2&amp;px=999" role="button" title="pic5.png" alt="pic5.png" /></span></SPAN></P><P><SPAN>The Content Modifier is used to set the message header and body.&nbsp; As only the translated text is required, the ‘Accept’ header is set to ‘application/octet-stream’.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pic6.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399780i4D8F1050FEBE8C8F/image-size/large?v=v2&amp;px=999" role="button" title="pic6.png" alt="pic6.png" /></span></SPAN></P><P><SPAN>The request body is configured as shown below:</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pic7.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399781i86D370854093BFC8/image-size/large?v=v2&amp;px=999" role="button" title="pic7.png" alt="pic7.png" /></span></SPAN></P><P><SPAN>Configure the HTTP receiver adapter to connect with document translation api as shown below.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pic8.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399782i397AF961D9332811/image-size/large?v=v2&amp;px=999" role="button" title="pic8.png" alt="pic8.png" /></span></SPAN></P><H2 id="toc-hId-176410958"><SPAN>Step 3:</SPAN></H2><P><SPAN>Test the iFlow endpoint using an API testing tool. In the request payload, ‘orderId’ is a mandatory field as defined in the XML Validator step; therefore, any payload that does not include ‘orderId’ is routed to an exception subprocess.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pic9.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/399783iE92A5133FF3E4D1F/image-size/large?v=v2&amp;px=999" role="button" title="pic9.png" alt="pic9.png" /></span></SPAN></P><P><SPAN><I>Please note that all the data are fictitious.</I></SPAN></P><H1 id="toc-hId-273300460">&nbsp;</H1><H1 id="toc-hId-76786955"><STRONG>Conclusion:</STRONG></H1><P>This blog post demonstrates a prototype for integrating Translation Hub with Cloud Integration.</P> 2026-04-19T12:53:57.332000+02:00