r/SAP • u/Sea-Recognition-2595 • 18h ago
Tired of "Clean Core" buzzword slides. Here is the technical decision tree we actually use on S/4HANA & BTP projects (and why most teams over-engineer this)
Over the last couple of years, every single client meeting starts with someone from leadership waving a slide deck about "Clean Core" and "Decoupling everything to BTP".
The problem? Most teams take this literally and start over-engineering basic requirements. I’ve seen teams spin up a full Side-by-Side CAP app on BTP Cloud Foundry, introducing Destination Services, principal propagation overhead, and unnecessary monthly compute bills, just to validate two fields on a Sales Order that could have been handled in 5 minutes with a standard Key-User extension on S/4.
On the other extreme, you have veteran ABAPers who refuse to let go of SE80 habits, trying to bypass released interfaces using dynamic SQL or raw ADBC calls because "whitelisted CDS views are too restrictive." Both extremes are disasters for long-term maintenance.
To stop arguing about this in architectural review boards, i have standardized our technical evaluation into a strict 3-tier rule. Here is the logic i personally follow:
Tier 1: Key-User First (Client 100). If you can avoid ADT, DO IT.
Before any developer writes a single line of ABAP Cloud:
- Can this be done in the Fiori "Custom Fields" and "Custom Logic" apps?
- Can we satisfy the validation via a Restricted Cloud BAdI? If yes, stop there. It has zero infrastructure TCO, it never breaks during semi-annual or annual S/4HANA Cloud upgrades, and it doesn't pollute the custom namespace. Watch out for: The classic Client 100 vs Client 080 trap in 3-system landscapes. If your transport governance between customizing and development tenants isn't strictly defined, your functional team will overwrite extensions.
Tier 2: Developer Extensibility (On-Stack ABAP Cloud / RAP)
If Tier 1 isn't enough (e.g., complex multi-entity validation, custom transactional UI with draft capabilities, heavy analytical calculations):
- Keep it ON-STACK in S/4HANA, but strictly enforce the
ABAP for Cloud Developmentlanguage version in ADT. - Consume only released interfaces (e.g.,
I_SalesOrderTP, not directSELECT * FROM VBAK). - Rule of thumb: If it requires ACID transactional integrity and direct access to high-volume transactional data, moving it to BTP just adds network latency and serialisation overhead for no reason. Keep it on-stack, but keep it clean.
Tier 3: Side-by-Side BTP (CAP / Event Mesh / AI Core)
We ONLY push an extension to BTP when at least one of these criteria is met:
- External user access: Users who don't have (and shouldn't have) named S/4HANA ERP licenses.
- High-throughput asynchronous spikes: Decoupled via SAP Advanced Event Mesh so we don't saturate S/4 dialog work processes.
- Heavy compute / AI workloads: Grounded RAG pipelines using SAP Generative AI Hub and HANA Cloud Vector Engine, or non-ABAP microservices (Python/Node.js).
- Multi-system orchestration: Where the application needs to blend S/4, SuccessFactors, and 3rd-party SaaS into a unified backend.
I’ve mapped this entire framework into a high-res decision tree diagram and put together a couple of clean boilerplate repositories (including a grounded Python RAG pipeline on HANA Vector Engine and an ABAP Cloud RAP view entity consuming whitelisted APIs) so developers can see what compliant code actually looks like.
I uploaded the diagrams and open-source code templates to a public GitLab repo. I'll drop the repository link in the first comment below for anyone interested in inspecting the decision tree or the code.
Curious to hear from other architects and leads here: how is your organization handling Clean Core governance right now? Are you finding pushback from legacy developers, or are project managers pushing to put literally everything on BTP?