Clean core vs on-stack extensions: impact on SAP CX cloud upgrades

We’re planning our SAP CX extension strategy and debating between clean core principles with side-by-side BTP extensions versus traditional on-stack customizations. Our team has extensive experience with on-stack development, but we’re concerned about upgrade complexity as SAP pushes toward clean core.

Has anyone migrated from on-stack to side-by-side extensions in SAP CX cloud? What’s the real-world impact on upgrade cycles and maintenance overhead? We have about 25 custom objects and 40 custom workflows currently implemented on-stack.

Example of current on-stack approach:


// Custom field extension directly in CX
customField: "AccountRiskScore"
extendedObject: "Account"
validation: inline_custom_logic

That’s a compelling upgrade time reduction. What about performance and user experience? Are there any drawbacks to having extensions run externally on BTP versus being directly in the CX platform? I’m particularly concerned about real-time data validation and workflow triggers.

We went through this migration last year. The upgrade impact difference is significant. On-stack extensions require testing and potential rework with every CX release. Side-by-side BTP extensions are upgrade-independent. Our upgrade windows went from 3 weeks to 4 days after moving 70% of customizations to BTP. However, the initial migration effort was substantial - about 6 months for a similar scope to yours.

Having guided multiple enterprises through this strategic decision, I can provide a comprehensive analysis of clean core principles, extension approaches, and upgrade impact:

Clean Core Principles in SAP CX Context:

Clean core isn’t just about where code runs-it’s about architectural philosophy. The core tenets are:

  1. Separation of Concerns: Business logic should be independent of platform upgrades. SAP CX handles transactional data and standard processes; extensions handle custom business rules.

  2. API-First Integration: All customizations interact with CX through stable, versioned APIs rather than direct database access or internal API calls that might change.

  3. Upgrade Independence: Extensions shouldn’t require modification when CX is upgraded. This is achieved by depending only on public APIs and avoiding modifications to standard objects.

  4. Cloud-Native Architecture: Extensions leverage cloud services (BTP) for scalability, resilience, and independent lifecycle management.

Your current on-stack approach violates clean core because custom fields directly extend CX objects, creating tight coupling that must be validated with every upgrade.

On-Stack vs Side-by-Side Extensions:

On-Stack Advantages:

  • Single platform management
  • Direct database access for complex queries
  • Simpler debugging and monitoring
  • No network latency between CX and extensions
  • Lower initial development cost

On-Stack Disadvantages:

  • Upgrades require regression testing all customizations
  • Risk of customization breaking with CX updates
  • Limited scalability (shares resources with CX core)
  • Vendor lock-in to CX platform specifics
  • Accumulating technical debt over time

Side-by-Side (BTP) Advantages:

  • Upgrade independence (extensions unaffected by CX updates)
  • Independent scaling and performance optimization
  • Technology flexibility (use any language/framework)
  • Easier A/B testing and gradual rollouts
  • Better alignment with modern DevOps practices
  • Cloud-native benefits (auto-scaling, resilience)

Side-by-Side Disadvantages:

  • Multi-platform operational complexity
  • Network latency for synchronous calls (typically 50-200ms)
  • Higher initial development and migration cost
  • More complex error handling and monitoring
  • Team needs broader skill set (CX + BTP + integration)

Upgrade and Maintenance Impact:

Based on real-world data from multiple migrations:

On-Stack Upgrade Cycle:

  • Pre-upgrade testing: 2-3 weeks (test all 40 workflows, 25 custom objects)
  • Upgrade execution: 2-4 days (with potential rollback)
  • Post-upgrade fixes: 1-2 weeks (addressing breaking changes)
  • Total downtime: 1-2 days
  • Frequency: 2-3 times/year with SAP CX cloud releases
  • Annual upgrade effort: 12-18 weeks of team time

Side-by-Side Upgrade Cycle:

  • Pre-upgrade testing: 2-3 days (test API contracts only)
  • Upgrade execution: 4-8 hours (minimal risk)
  • Post-upgrade fixes: rare (maybe 2-3 days/year)
  • Total downtime: 2-4 hours
  • Frequency: CX upgrades don’t affect extensions
  • Annual upgrade effort: 1-2 weeks of team time

Migration Strategy for Your Scenario:

With 25 custom objects and 40 workflows, here’s a pragmatic approach:

Phase 1 - Assessment (4 weeks):

  • Categorize customizations by coupling level
  • Identify “keep on-stack” candidates (tightly coupled, low change frequency)
  • Identify “migrate to BTP” candidates (business logic, high change frequency)
  • Estimate migration effort per customization

Phase 2 - Quick Wins (8 weeks):

  • Migrate 5-8 simple workflows to BTP (proof of concept)
  • Establish BTP development and deployment pipeline
  • Train team on event-driven architecture
  • Validate performance and monitoring approach

Phase 3 - Core Migration (20 weeks):

  • Migrate remaining workflows to BTP services
  • Convert custom objects to extension data model
  • Implement event mesh for real-time synchronization
  • Establish API versioning and contract testing

Phase 4 - Optimization (8 weeks):

  • Performance tuning and caching strategies
  • Monitoring and alerting consolidation
  • Documentation and knowledge transfer
  • Decommission on-stack customizations

Technical Pattern for Migration:

Your current on-stack field extension would become:


// Clean core approach - Pseudocode
1. Create extension data object in BTP CAP service
2. Define AccountRiskScore as separate entity
3. Link to CX Account via externalId
4. Subscribe to Account.Created/Updated events
5. Calculate risk score in BTP service
6. Expose via OData API for CX UI consumption
// Reference: SAP BTP CAP Documentation - Extension Pattern

Key Decision Factors:

  1. If upgrade agility is priority: Go side-by-side. The 85% reduction in upgrade effort pays back migration cost in 18-24 months.

  2. If team skills are limited: Start hybrid. Keep 30% on-stack (low-change items), migrate 70% to BTP (high-change items).

  3. If performance is critical: Hybrid approach. Real-time validations can stay on-stack; batch processing and analytics move to BTP.

  4. If budget is constrained: Gradual migration over 2-3 years, prioritizing highest-maintenance customizations first.

My Recommendation:

For your scenario, adopt a hybrid strategy with 70/30 split favoring BTP:

  • Migrate 30 workflows to BTP (those with frequent changes)
  • Keep 10 workflows on-stack (stable, tightly coupled)
  • Migrate 18 custom objects to BTP extension data model
  • Keep 7 custom objects on-stack (core CX data extensions)

This approach:

  • Reduces upgrade effort by 60-70% (good ROI)
  • Limits migration risk by keeping stable items on-stack
  • Builds team capability gradually
  • Positions you for full clean core adoption over 3 years

The future is clearly side-by-side extensions, but pragmatic migration beats ideological purity. Start with high-value, low-risk migrations and build momentum.

Don’t underestimate the learning curve and operational complexity. Side-by-side means managing two platforms, two deployment pipelines, two monitoring systems. Your DevOps team needs skills in both CX and BTP. Also, debugging issues that span both platforms is more complex than debugging on-stack code. Clean core is the future, but the transition cost is real.

Performance is actually better in many cases because BTP can scale independently. For real-time validation, you use CX’s event mesh to trigger BTP services with sub-100ms latency. The architecture looks like this:


// Event-driven BTP extension
CX_Event: Account.Update
→ Event_Mesh → BTP_Service
→ Calculate_RiskScore
→ Callback_API → Update_CX

The decoupling also means you can update business logic without touching CX core, which is huge for agile development.

Clean core is SAP’s strategic direction, but it’s not a binary choice. You can adopt a hybrid approach where critical, tightly-coupled extensions stay on-stack while loosely-coupled business logic moves to BTP. The key is understanding which customizations truly need to be embedded in the CX core versus which can operate as external services.