SAP Clean Core Extensibility: Tier Model, ABAP Cloud, and BTP Side-by-Side Extensions

Type: ERP Integration System: SAP S/4HANA (2025 / 2408) Confidence: 0.92 Sources: 7 Verified: 2026-03-02 Freshness: 2026-03-01

TL;DR

System Profile

SAP Clean Core is not a single API or product -- it is a strategic framework and governance model that spans all SAP S/4HANA editions (Cloud Public, Cloud Private, and On-Premise). The framework defines how custom extensions, integrations, and configurations should be built to keep the ERP core standard, upgrade-safe, and cloud-ready. It covers six dimensions: clean processes, clean extensions, clean data, clean integration, clean operations, and clean software stack. This card focuses on the clean extensions dimension. [src4]

PropertyValue
VendorSAP
SystemSAP S/4HANA (2025 / 2408)
API SurfaceOData v2/v4, ABAP Cloud, BTP CAP (Node.js / Java)
Framework VersionClean Core Level Concept (replaces 3-Tier, August 2025)
Editions CoveredCloud Public, Cloud Private, On-Premise
DeploymentCloud / On-Premise / Hybrid
API DocsSAP API Business Hub
StatusGA (evolved from 3-Tier to A-D in 2025)

API Surfaces & Capabilities

SAP Clean Core defines multiple extension surfaces, each with different clean core compliance implications. The fundamental principle is: extensions must access SAP business objects only through well-defined, upgrade-stable interfaces. [src3]

Extension SurfaceTechnologyClean Core LevelBest ForDeploymentUpgrade-Safe?Cloud Public?
Key User ExtensibilityCustom Fields & Logic, SAP BuildASimple field additions, validations, form adaptationsOn-stackYesYes
Developer On-Stack (ABAP Cloud)ABAP Cloud (restricted language version)AComplex business logic using released APIs onlyOn-stackYesYes
Side-by-Side (BTP CAP)CAP (Node.js/Java), SAP Build AppsAIndependent apps, AI/ML, cross-system orchestrationBTPYesYes
Classic ABAP (released BAPIs/RFCs)BAPIs, IDocs, RFCs, batch jobsBLegacy-compatible, stable but not cloud-readyOn-stackMostlyNo
Classic ABAP (unreleased objects)Internal SAP objects, archiving frameworksCLegacy gap-filling, data managementOn-stackRiskyNo
Modifications / direct table writesSAP standard modifications, implicit enhancementsDNever recommendedOn-stackNoNo

Rate Limits & Quotas

Clean Core does not define traditional API rate limits. Instead, the constraints are governance-based: what you are allowed to develop, and what the ATC will permit through transport pipelines. [src5]

ABAP Cloud Language Restrictions

RestrictionABAP Cloud (Level A)Classic ABAP (Level B-D)Notes
Allowed syntaxRestricted subset (no dynpro, no classic reports, no direct DB writes)Full ABAP syntaxABAP Cloud enforces at compile time
Object accessReleased APIs only (SAP API Business Hub / Cloudification Repository)Any SAP object~25,000+ released objects as of 2025
Database accessCDS views and released ABAP SQL onlyDirect table reads/writesNo SELECT on SAP tables in ABAP Cloud
UI technologySAP Fiori / SAPUI5 (via RAP)Classic dynpro, SAP GUI, Web DynproClassic UIs are Level C/D
Enhancement techniqueBAdIs (released) onlyBAdIs, enhancements, modifications, user exitsOnly released BAdIs qualify for Level A

ATC Governance Thresholds

ATC Check VariantPurposeLevel A FindingLevel B FindingLevel C FindingLevel D Finding
CLOUD_READINESSPrimary clean core assessmentNo findingsInformational messagesWarningsErrors (may block transport)
S4HANA_READINESSLegacy ECC pattern detectionN/AN/AWarningsErrors
ABAP_CLEAN_CORE_READINESSComprehensive (BTP 2605+)No findingsInformationalWarningsErrors (blocking)

Authentication

FlowUse WhenTechnologyLevelNotes
Communication ArrangementOn-stack ABAP Cloud calling external systemsSAP Communication ManagementAStandard for on-stack outbound calls
OAuth 2.0 Client CredentialsBTP side-by-side calling S/4HANA APIsSAP BTP Destination ServiceARecommended for server-to-server
OAuth 2.0 SAML AssertionBTP extension with user context propagationSAP BTP + IAS/IPSAPreserves user identity across systems
Principal PropagationBTP app needs S/4HANA user authorizationSAP Cloud Connector + BTPARequired when on-premise
RFC Trust (SM59)Classic system-to-system communicationRFC DestinationsBStable but not cloud-ready

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- Organization wants clean core compliant extensions for SAP S/4HANA
|
+-- Which S/4HANA edition?
|   +-- Cloud Public Edition
|   |   +-- Only Level A allowed
|   |   +-- Key user extension? (custom fields, logic, forms)
|   |   |   +-- YES --> Custom Fields & Logic app, SAP Build Process Automation
|   |   |   +-- NO  --> Developer extension needed?
|   |   |       +-- On-stack logic, tight ERP integration --> ABAP Cloud (RAP, released BAdIs)
|   |   |       +-- Independent app, AI/ML, cross-system --> BTP side-by-side (CAP)
|   |   |       +-- Low-code workflow/app --> SAP Build Apps / Process Automation
|   |
|   +-- Cloud Private Edition or On-Premise
|       +-- New development?
|       |   +-- YES --> Target Level A (ABAP Cloud or BTP)
|       |   +-- NO  --> Existing custom code?
|       |       +-- Run ATC CLOUD_READINESS check
|       |       +-- Level A findings? --> Already clean, maintain
|       |       +-- Level B findings? --> Stable but plan migration to released APIs
|       |       +-- Level C findings? --> Monitor via Simplification Database, plan remediation
|       |       +-- Level D findings? --> Remediate immediately (highest risk)
|
+-- What type of extension?
|   +-- Simple configuration (fields, validations)
|   |   --> Key User Extensibility (Level A, no coding)
|   +-- Complex business logic, tight ERP coupling
|   |   --> ABAP Cloud on-stack (Level A) -- use released APIs/BAdIs only
|   |   --> If released API missing: use wrapper (Level B) + log gap for SAP
|   +-- Independent application, UI, or process
|   |   --> BTP side-by-side with CAP (Level A)
|   +-- AI/ML, advanced analytics, cross-system orchestration
|   |   --> BTP side-by-side (Level A) + SAP AI Core / HANA Cloud
|   +-- Legacy interface maintenance
|       --> Classify with ATC, plan migration path, target Level A
|
+-- Custom code migration (ECC or classic S/4HANA)?
    +-- Step 1: Run Custom Code Migration app against source system
    +-- Step 2: Analyze ATC findings by clean core level (A/B/C/D)
    +-- Step 3: Prioritize -- eliminate Level D first, then C, then B
    +-- Step 4: For each finding: keep + wrap (B) vs. rewrite (A) vs. retire
    +-- Step 5: New development in ABAP Cloud only

Quick Reference

Clean Core Levels at a Glance

LevelComplianceTechnologiesATC FindingUpgrade RiskCloud Public?Recommended?
AFully compliantABAP Cloud, BTP/CAP, SAP Build, Key User ToolsNoneNoneYesYes -- target for all new development
BConditionally compliantBAPIs, IDocs, RFCs, released-but-classic APIsInformationalLowNoAcceptable for existing code, plan migration
CPartially compliantUnreleased SAP objects, archiving (ADK/ILM), TAANAWarningsMediumNoMonitor via SDB, remediate within 12 months
DNon-compliantModifications, direct table writes, implicit enhancements, NoAPIErrors (blocking)HighNoEliminate immediately

Old 3-Tier to New A-D Mapping

Old ModelNew ModelWhat Changed
Tier 1 (ABAP Cloud on-stack + BTP side-by-side)Level ASame scope, renamed for clarity
Tier 2 (wrapper for unreleased APIs)Level BDowngraded -- wrappers are no longer "clean"
Tier 3 (classic ABAP)Level C + DSplit into two: C (risky but manageable) vs D (prohibited)

Key User vs Developer vs Side-by-Side Extensibility

DimensionKey User (on-stack)Developer (on-stack)Side-by-Side (BTP)
Skill requiredBusiness analystABAP developerFull-stack developer (Node.js/Java)
ToolsCustom Fields & Logic app, SAP BuildABAP Development Tools (Eclipse), RAPSAP Business Application Studio, CAP
LanguageNo-code / low-codeABAP Cloud (restricted)Node.js, Java, Python
DeploymentS/4HANA tenantS/4HANA tenantBTP Cloud Foundry or Kyma
Data accessPredefined extension pointsReleased APIs, CDS viewsS/4HANA APIs via Destination Service
LifecycleManaged by S/4HANA upgradesManaged by developer, ATC-validatedIndependent lifecycle
Best forCustom fields, simple validations, UI adaptationsComplex business logic, custom entities, reportsIndependent apps, AI/ML, cross-system processes
Clean Core LevelAA (if released APIs only)A

Step-by-Step Integration Guide

1. Assess existing custom code with ATC

Run the ABAP Test Cockpit with the CLOUD_READINESS check variant to classify all custom code objects by clean core level. [src5]

" In SAP GUI: transaction ATC or SE80 > ATC
" Or via BTP ABAP Environment for remote analysis:
" 1. Configure central ATC on BTP (recommended by SAP)
" 2. Connect source S/4HANA system via RFC
" 3. Run check variant CLOUD_READINESS against Z* / Y* namespaces
" 4. Export findings report (Excel or ALV)

Verify: ATC results show findings categorized as Informational (Level B), Warning (Level C), or Error (Level D). No findings = Level A compliant.

2. Build an on-stack ABAP Cloud extension (Level A)

Create a new development object using ABAP Cloud language version. Only released APIs are accessible. [src1]

" In ABAP Development Tools (Eclipse):
" 1. Create a new ABAP Package with language version "ABAP for Cloud Development"
" 2. All objects in this package are restricted to ABAP Cloud syntax

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Custom Sales Order View'
define view entity ZI_SalesOrderCustom
  as select from I_SalesOrder  " <-- released CDS view (Level A)
{
  key SalesOrder,
      SalesOrganization,
      SoldToParty,
      TotalNetAmount,
      TransactionCurrency
}
where SalesOrganization = '1000'

Verify: ATC run on the new object shows zero findings. Object deploys without transport errors.

3. Create a wrapper for an unreleased API (Level B, temporary)

When a released API does not exist for your use case, create a wrapper in Standard ABAP and release it for ABAP Cloud consumption. Plan to remove the wrapper once SAP releases the official API. [src1]

" Step 1: Create wrapper class in Standard ABAP (language version: Standard)
CLASS zcl_wrapper_example DEFINITION PUBLIC FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    CLASS-METHODS get_material_data
      IMPORTING iv_matnr       TYPE matnr
      RETURNING VALUE(rs_data) TYPE mara.
ENDCLASS.

CLASS zcl_wrapper_example IMPLEMENTATION.
  METHOD get_material_data.
    SELECT SINGLE * FROM mara INTO rs_data WHERE matnr = iv_matnr.
  ENDMETHOD.
ENDCLASS.

" Step 2: Release wrapper class for ABAP Cloud: Properties > API State > Released
" Step 3: In ABAP Cloud code, consume the released wrapper
" Step 4: When SAP releases the API, replace wrapper with released API

Verify: ATC on the ABAP Cloud consumer shows Informational finding (Level B).

4. Build a BTP side-by-side extension with CAP

Create an independent application on SAP BTP that connects to S/4HANA via APIs. [src3, src6]

# Scaffold a CAP project
npm init -y
npm add @sap/cds @sap/cds-dk
npx cds init my-extension --add hana,approuter

# Import S/4HANA OData service definition
cd my-extension
npx cds import API_SALES_ORDER_SRV.edmx --as external

# Deploy to Cloud Foundry
cf login -a https://api.cf.<region>.hana.ondemand.com
npx cds build --production
cf push

Verify: cf apps shows the application running. API returns data from S/4HANA.

Code Examples

Python: Check released APIs via Cloudification Repository

# Input:  GitHub Cloudification Repository JSON
# Output: List of released objects matching a search term
import requests  # requests==2.31.0

CLOUDIFICATION_REPO_URL = (
    "https://raw.githubusercontent.com/SAP/abap-atc-cr-cv-s4hc/"
    "main/src/objectReleaseInfo_s4hc2408.json"
)

def search_released_objects(search_term: str, max_results: int = 20):
    resp = requests.get(CLOUDIFICATION_REPO_URL, timeout=30)
    resp.raise_for_status()
    data = resp.json()
    results = []
    term_lower = search_term.lower()
    for obj in data.get("objectReleaseInfo", []):
        obj_name = obj.get("objectName", "").lower()
        if term_lower in obj_name:
            results.append({
                "name": obj.get("objectName"),
                "type": obj.get("objectType"),
                "release_state": obj.get("releaseState"),
            })
            if len(results) >= max_results:
                break
    return results

released = search_released_objects("salesorder")
for obj in released:
    print(f"  {obj['type']:10s} {obj['name']:40s} [{obj['release_state']}]")

ABAP: Check if an object is released for ABAP Cloud

" Input:  Object name (class, CDS view, etc.)
" Output: Release state (released / not released / deprecated)

" Method 1: Use XCO library (available in ABAP Cloud)
DATA(lo_class) = xco_cp_abap=>class( 'CL_SOME_SAP_CLASS' ).
DATA(lv_release_state) = lo_class->content( )->get_release_state( ).
" Returns: if_xco_ar_release_state=>co_released

" Method 2: Use Cloudification Repository Viewer (Fiori app)
" App ID: F5670 - ABAP Cloud Readiness

" Method 3: ATC Check (most comprehensive)
" Transaction ATC > Run with CLOUD_READINESS variant

Data Mapping

Extension Pattern to Clean Core Level Mapping

Extension PatternOld ModelNew LevelMigration PathEffort
Custom Fiori app using released ODataTier 1ANone needed-
CAP app on BTP calling S/4 APIsTier 1ANone needed-
Key user custom fields via Custom Fields appTier 1ANone needed-
BAPI wrapper in Standard ABAP, released for CloudTier 2BReplace with released API when availableLow-Medium
Classic report (WRITE statement) on Z-tableTier 3CRewrite as RAP-based Fiori appHigh
User exit / customer exitTier 3C-DReplace with released BAdIMedium-High
SAP standard modification (SMOD/CMOD)Tier 3DEliminate, use BAdI or BTP extensionHigh
Direct MODIFY on SAP tableTier 3DEliminate, use released APICritical
Implicit enhancement pointTier 3DEliminate, use released BAdIHigh

Data Type Gotchas

Error Handling & Failure Points

Common ATC / Clean Core Errors

ATC MessageLevelMeaningResolution
Use of unreleased SAP objectCCode accesses an internal SAP object not in Cloudification RepositoryReplace with released equivalent or create wrapper (Level B)
Use of classic ABAP statementCCode uses dynpro, WRITE, CALL SCREEN, etc.Rewrite using RAP/Fiori patterns
Direct access to SAP database tableC-DSELECT/MODIFY on SAP tables (VBAK, MARA, etc.)Use released CDS views or APIs
Modification of SAP standard objectDSMOD/CMOD modification, implicit enhancementEliminate and use BAdI/BTP extension
Use of NoAPI objectDObject explicitly flagged by SAP as "do not use"Must be removed -- no workaround
Obsolete ABAP statementB-CCode uses obsolete syntax (MOVE, COMPUTE, etc.)Replace with modern ABAP syntax

Failure Points in Production

Anti-Patterns

Wrong: Wrapping every unreleased object into Level B

" BAD -- creating hundreds of wrappers to make classic code "technically" compliant
" This creates unmanageable technical debt and a shadow API layer
CLASS zcl_wrap_mara DEFINITION PUBLIC CREATE PUBLIC.
  PUBLIC SECTION.
    CLASS-METHODS get IMPORTING iv TYPE matnr RETURNING VALUE(rs) TYPE mara.
ENDCLASS.
CLASS zcl_wrap_bseg DEFINITION PUBLIC CREATE PUBLIC.
  PUBLIC SECTION.
    CLASS-METHODS get IMPORTING iv TYPE belnr_d RETURNING VALUE(rs) TYPE bseg.
ENDCLASS.
" ... 200 more wrappers ...

Correct: Evaluate each gap and choose the right strategy

" GOOD -- decision tree for each unreleased object:
" 1. Does a released API exist? --> Use it (Level A)
" 2. Is the functionality still needed? --> Maybe retire the custom code
" 3. Can it be rebuilt as a BTP extension? --> Side-by-side (Level A)
" 4. No alternative exists? --> Create ONE wrapper, log SAP Influence request,
"    set review date, and document in wrapper registry

Wrong: Building new classic ABAP without checking released alternatives

" BAD -- developer creates a classic report because "that's how we always did it"
REPORT zsd_order_list.
SELECT * FROM vbak INTO TABLE @DATA(lt_orders)
  WHERE erdat >= @sy-datum - 30.
LOOP AT lt_orders INTO DATA(ls_order).
  WRITE: / ls_order-vbeln, ls_order-erdat, ls_order-netwr.
ENDLOOP.

Correct: Use ABAP Cloud with RAP and released CDS views

" GOOD -- same requirement, Level A compliant
" 1. Create a CDS view consuming released I_SalesOrder
" 2. Expose via RAP service binding (OData V4)
" 3. Build Fiori Elements list report (zero UI code)

@EndUserText.label: 'Recent Sales Orders'
define view entity ZC_RecentSalesOrders
  as select from I_SalesOrder
{
  key SalesOrder,
      CreationDate,
      TotalNetAmount,
      TransactionCurrency
}
where CreationDate >= $session.system_date - 30

Common Pitfalls

Diagnostic Commands

" Check ATC findings for a specific package
" Transaction: ATC
" 1. Create/select check variant: CLOUD_READINESS
" 2. Object scope: Package = Z_MY_PACKAGE (including subpackages)
" 3. Execute > Review findings by priority (Error > Warning > Info)

" Check released status of a specific object
" Transaction: SE80 or ADT (Eclipse)
" Navigate to object > Properties > API State
" Released = Level A compatible

" Check Clean Core Dashboard metrics
" SAP for Me > Clean Core Dashboard (S/4HANA Cloud Private Edition)

" Cloudification Repository (programmatic check)
" GitHub: https://github.com/SAP/abap-atc-cr-cv-s4hc
# Check Cloudification Repository for a specific object (command line)
curl -s "https://raw.githubusercontent.com/SAP/abap-atc-cr-cv-s4hc/main/src/objectReleaseInfo_s4hc2408.json" \
  | python3 -c "
import json, sys
data = json.load(sys.stdin)
term = 'salesorder'
for obj in data.get('objectReleaseInfo', []):
    if term.lower() in obj.get('objectName', '').lower():
        print(f\"{obj['objectType']:10s} {obj['objectName']:40s} [{obj['releaseState']}]\")
"

Version History & Compatibility

Framework VersionDateStatusKey ChangesMigration Notes
A-D Clean Core Levels2025-08CurrentReplaced 3-tier model; 4 levels with ATC-based governanceTier 2 reclassified as Level B; Tier 3 split into C + D
3-Tier Extensibility Model2022-2025SupersededTier 1 (clean), Tier 2 (wrapper), Tier 3 (classic)Tier 1 = Level A; Tier 2 = Level B; Tier 3 = Level C/D
ABAP Cloud (introduction)2020GARestricted ABAP language version for cloud developmentRequired for all Level A on-stack extensions
RAP (RESTful ABAP Programming)2020GAApplication framework for ABAP CloudStandard pattern for Level A transactional apps
SAP BTP Extension Suite2019GASide-by-side extension platformRequired for Level A side-by-side extensions

Deprecation Policy

SAP does not deprecate clean core levels -- they are cumulative and backward-compatible. SAP commits to a 2-year deprecation notice for any released API that will be removed. The Cloudification Repository on GitHub is updated with each S/4HANA release. [src1, src7]

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Planning S/4HANA cloud migration and need to assess custom codeAlready on S/4HANA Cloud Public with no custom ABAPKey user extensibility tools directly
Building new extensions for S/4HANA (any edition)Working with SAP ECC (pre-S/4HANA)Migrate to S/4HANA first, then apply clean core
Need to classify existing custom code by upgrade riskNeed specific API rate limits and endpointsSAP S/4HANA OData API Capabilities
Evaluating BTP vs on-stack extension architectureNeed BAPI/RFC technical detailsSAP BAPI/RFC Integration
Setting up ATC governance and CI/CD transport controlsNeed SAP Integration Suite capabilitiesSAP Integration Suite Capabilities
Deciding between key user, developer, and side-by-sideNeed authentication setup detailsSAP Authentication Methods

Important Caveats

Related Units