{"id":160,"date":"2025-07-06T18:27:52","date_gmt":"2025-07-06T22:27:52","guid":{"rendered":"https:\/\/www.tech-freaks.com\/?p=160"},"modified":"2025-07-06T20:40:46","modified_gmt":"2025-07-07T00:40:46","slug":"mapping-sfcc-to-commercetools-part-1","status":"publish","type":"post","link":"https:\/\/www.tech-freaks.com\/ecommerce-platforms\/mapping-sfcc-to-commercetools-part-1.html","title":{"rendered":"Mapping SFCC to CommerceTools: Part 1 \u2013 Architecture, APIs, and Core Commerce Features"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"160\" class=\"elementor elementor-160\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bd0f603 e-flex e-con-boxed e-con e-parent\" data-id=\"bd0f603\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-013a908 elementor-widget elementor-widget-text-editor\" data-id=\"013a908\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-pm-slice=\"1 1 []\">If you\u2019ve spent years building storefronts, integrations, or backend logic in <strong>Salesforce Commerce Cloud (SFCC)<\/strong> using <strong>OCAPI<\/strong>, <strong>SCAPI<\/strong>, and <strong>Business Manager<\/strong>, switching to <strong>CommerceTools<\/strong> can feel like jumping into an entirely new paradigm. Where are the controllers? What happened to the familiar <code>beforeGET<\/code> and <code>modifyAfterPOST<\/code> hooks to intercept and modify API behavior? What\u2019s the equivalent of custom objects? Where\u2019s the Business Manager?<\/p>\n<p>This article helps bridge that mental gap by mapping common SFCC concepts to their CommerceTools counterparts\u2014starting with APIs, catalog, cart, and customer functionality.<\/p>\n<p>Whether you&#8217;re an architect exploring headless options or a developer upskilling for a replatform, this guide is for you.<\/p>\n<p>As a side note, one major strategic advantage of CommerceTools is that it offers a <strong>60-day trial environment<\/strong> to businesses and developers. This hands-on access makes it easier for architects, developers, and even business stakeholders to explore the platform&#8217;s capabilities and assess fit early in their decision-making process.<\/p>\n<p>By contrast, Salesforce Commerce Cloud does <strong>not<\/strong> provide public or time-bound trial access, which limits experimentation, learning, and certification opportunities. This restriction can act as a barrier for new developers and consultants who might otherwise advocate for the platform. In the long run, this could put SFCC at a disadvantage, as developer and architect familiarity plays a major role in influencing platform adoption and enterprise decisions.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-037f77a elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"037f77a\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-86af150 elementor-widget elementor-widget-heading\" data-id=\"86af150\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">\ud83d\udee0\ufe0f Business Manager vs Merchant Center<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5083e99 elementor-widget elementor-widget-text-editor\" data-id=\"5083e99\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-pm-slice=\"1 1 []\">Before diving into APIs, it&#8217;s important to understand the role of each platform&#8217;s administrative console.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9aec90f elementor-widget elementor-widget-html\" data-id=\"9aec90f\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<table>\r\n  <thead>\r\n    <tr>\r\n      <th>Feature Area<\/th>\r\n      <th>SFCC Business Manager<\/th>\r\n      <th>CommerceTools Merchant Center<\/th>\r\n    <\/tr>\r\n  <\/thead>\r\n  <tbody>\r\n    <tr>\r\n      <td><strong>Catalog Management<\/strong><\/td>\r\n      <td>Full control over products, categories, price books<\/td>\r\n      <td>Manage products, product types, categories, prices<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>User Roles & Permissions<\/strong><\/td>\r\n      <td>Configure roles, permissions, organizations<\/td>\r\n      <td>Manage users and roles for project access<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Content & Slots<\/strong><\/td>\r\n      <td>Page Designer, content assets, slots, A\/B testing<\/td>\r\n      <td>Very limited; content managed via external CMS<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Custom Preferences<\/strong><\/td>\r\n      <td>Site-specific preferences editable in BM<\/td>\r\n      <td>Not available \u2013 config lives in custom fields or external systems<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Job Schedules<\/strong><\/td>\r\n      <td>Built-in job scheduler and logs<\/td>\r\n      <td>No native jobs UI \u2013 use API\/webhooks\/integration<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Order Management<\/strong><\/td>\r\n      <td>View, edit, export orders<\/td>\r\n      <td>View and search orders, some limited edits<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Customer Management<\/strong><\/td>\r\n      <td>View\/edit customer profiles and address books<\/td>\r\n      <td>View-only access; no rich customer admin tooling<\/td>\r\n    <\/tr>\r\n  <\/tbody>\r\n<\/table>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fabe10e elementor-widget elementor-widget-text-editor\" data-id=\"fabe10e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-pm-slice=\"1 1 []\">\ud83d\udccc <strong>Key Takeaway:<\/strong> The SFCC Business Manager is more mature and full-featured as an operational tool. In CommerceTools, the <strong>Merchant Center is API-first and minimal<\/strong>, meant to supplement\u2014not replace\u2014custom tooling. This means CommerceTools encourages businesses to build their own operational portals or use 3rd-party admin interfaces tailored to their workflow.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ad6336a elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"ad6336a\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b631bf8 elementor-widget elementor-widget-heading\" data-id=\"b631bf8\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">\ud83c\udf0d Multi-Region Support Using Stores and Product Selections<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-007681e elementor-widget elementor-widget-text-editor\" data-id=\"007681e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-pm-slice=\"1 1 []\">CommerceTools doesn\u2019t use the concept of \u201cSites\u201d like SFCC but enables similar multi-region or multi-brand configurations using:<\/p><ul data-spread=\"false\"><li><p><strong>Stores<\/strong> \u2013 Each store represents a region or brand (e.g., US Store, CA Store)<\/p><\/li><li><p><strong>Product Selections<\/strong> \u2013 Assign products to specific stores as their catalog<\/p><\/li><li><p><strong>Channels<\/strong> \u2013 Optional layer for inventory\/pricing scoping<\/p><\/li><li><p><strong>storeKey in API calls<\/strong> \u2013 Scopes customer, cart, and product responses to the intended store<\/p><\/li><\/ul><p>\ud83d\udccc <strong>Example:<\/strong> To support both US and CA storefronts in the same project, you would:<\/p><ol start=\"1\" data-spread=\"false\"><li><p>Create two Stores (<code>us<\/code>, <code>ca<\/code>)<\/p><\/li><li><p>Assign product selections for each store<\/p><\/li><li><p>Use <code>GET \/us\/products<\/code> or <code>POST \/ca\/carts<\/code> to operate within a store\u2019s context<\/p><\/li><\/ol><p>\ud83d\udcce While customers exist at the project level, you can tag them to a store using <strong>Customer Groups<\/strong> or custom fields.<\/p><p>This gives you <strong>similar outcomes to SFCC\u2019s site separation<\/strong>, but you manage the segmentation yourself through configuration and API conventions.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-53ec910 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"53ec910\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5fc62da elementor-widget elementor-widget-heading\" data-id=\"5fc62da\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">\ud83d\udd01 API Strategy and Architecture<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cfd4729 elementor-widget elementor-widget-html\" data-id=\"cfd4729\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<table>\r\n  <thead>\r\n    <tr>\r\n      <th>Area<\/th>\r\n      <th>SFCC<\/th>\r\n      <th>CommerceTools<\/th>\r\n    <\/tr>\r\n  <\/thead>\r\n  <tbody>\r\n    <tr>\r\n      <td><strong>API Style<\/strong><\/td>\r\n      <td>OCAPI (REST), SCAPI (REST + OAuth2)<\/td>\r\n      <td>Pure API-first: REST and GraphQL<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Auth<\/strong><\/td>\r\n      <td>OCAPI: client ID & roles; SCAPI: SLAS (Shopper Login & API Access)<\/td>\r\n      <td>OAuth2: supports <code>client_credentials<\/code>, <code>password<\/code>, <code>refresh_token<\/code> flows<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Headless Readiness<\/strong><\/td>\r\n      <td>Added gradually (SCAPI, Page Designer APIs)<\/td>\r\n      <td>Built headless from the ground up<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>API Surface<\/strong><\/td>\r\n      <td>Split across OCAPI and SCAPI (Shop, Data, Meta)<\/td>\r\n      <td>Uniform access via REST and GraphQL across all domains<\/td>\r\n    <\/tr>\r\n  <\/tbody>\r\n<\/table>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-df5d59d elementor-widget elementor-widget-text-editor\" data-id=\"df5d59d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-pm-slice=\"1 1 []\">\ud83d\udccc <strong>Key Difference:<\/strong> CommerceTools treats APIs as the <strong>primary interface<\/strong>, not a layer on top of a monolith. There\u2019s no \u201cBusiness Manager\u201d style fallback\u2014everything goes through the API.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8e4e3c1 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"8e4e3c1\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4640876 elementor-widget elementor-widget-heading\" data-id=\"4640876\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">\ud83d\udec6 Product Catalog and Categories<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c74a6f6 elementor-widget elementor-widget-text-editor\" data-id=\"c74a6f6\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-pm-slice=\"1 1 []\">For SFCC developers used to the layered catalog model\u2014<strong>Master Catalog<\/strong>, <strong>Variation Groups<\/strong>, <strong>SKUs<\/strong>, and <strong>Navigation Catalogs<\/strong>\u2014CommerceTools presents a flatter but more composable structure. Understanding how CommerceTools handles <strong>product modeling, variants, and attributes<\/strong> is key to transitioning smoothly.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5e6a6e9 elementor-widget elementor-widget-html\" data-id=\"5e6a6e9\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<table>\r\n  <thead>\r\n    <tr>\r\n      <th>Concept<\/th>\r\n      <th>SFCC<\/th>\r\n      <th>CommerceTools<\/th>\r\n    <\/tr>\r\n  <\/thead>\r\n  <tbody>\r\n    <tr>\r\n      <td><strong>Catalog<\/strong><\/td>\r\n      <td>Master Catalog + Site-specific Navigation Catalog(s)<\/td>\r\n      <td>No built-in separation; filtering by product selection or store context<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Categories<\/strong><\/td>\r\n      <td>Assigned per Navigation Catalog<\/td>\r\n      <td>Hierarchical; assignable to products within a store or globally<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Product Structure<\/strong><\/td>\r\n      <td>Master, Variation Group, Variant<\/td>\r\n      <td>Product with variants, defined via attributes and productType<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Variation Attributes<\/strong><\/td>\r\n      <td>Size, color, style etc. defined in variation model<\/td>\r\n      <td>Driven by productType + attribute definitions<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Product Attributes<\/strong><\/td>\r\n      <td>Custom and system attributes<\/td>\r\n      <td>Custom attributes via productType; typed and validated<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>SKU Level<\/strong><\/td>\r\n      <td>Variant ID (SKU) managed in variation matrix<\/td>\r\n      <td>Each variant is its own object with SKU and attributes<\/td>\r\n    <\/tr>\r\n  <\/tbody>\r\n<\/table>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-27251e1 elementor-widget elementor-widget-text-editor\" data-id=\"27251e1\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5>\ud83d\udd01 What Changes<\/h5><ul data-spread=\"false\"><li><p><strong>No three-level hierarchy<\/strong> like Master \u2192 Variation Group \u2192 Variant. In CommerceTools, there are only products and variants based on the variant-defining attributes.<\/p><\/li><li><p><strong>Product Types<\/strong> are mandatory. You define them with a schema of attributes before any product creation.<\/p><\/li><li><p>Each <strong>attribute<\/strong> is reusable and can be configured with <code>attributeConstraint = CombinationUnique<\/code> and <code>level = variant<\/code> to drive variant combinations.<\/p><\/li><li><p><strong>No site-specific price books<\/strong> \u2014 prices live directly on variants with <code>currencyCode<\/code> and optional <code>channel<\/code>.<\/p><\/li><\/ul><h5>\u26a0\ufe0f Gotchas &amp; Tips<\/h5><ul data-spread=\"false\"><li><p>CommerceTools doesn\u2019t enforce product uniqueness at the catalog level \u2014 you must manage slugs and keys carefully.<\/p><\/li><li><p>There is no visual matrix like SFCC\u2019s VG editor \u2014 variant definitions are more flexible but require thoughtful schema.<\/p><\/li><li><p>All variant combinations must be explicitly created \u2014 CT does not auto-generate them.<\/p><\/li><li><p>The UI in Merchant Center uses <strong>&#8220;level: variant&#8221;<\/strong> to indicate variant-defining attributes. In the API, this is modeled using <code>attributeConstraint = CombinationUnique<\/code>.\u00a0<\/p><\/li><\/ul><h5>\ud83e\udde0 Clarification:<\/h5><p>A <strong>ProductType<\/strong> in CommerceTools is not equivalent to a single variation attribute in SFCC\u2014it&#8217;s broader. It defines the full schema for a product, including both product-level and variant-level attributes.<\/p><ul data-spread=\"false\"><li><p>Attributes with <code>level: variant<\/code> and <code>attributeConstraint = CombinationUnique<\/code> help resolve a product down to a <strong>specific variant<\/strong> (SKU). These are equivalent to SFCC <strong>Variation Attributes<\/strong>.<\/p><\/li><li><p>Attributes with <code>level: product<\/code> are more like <strong>standard attributes<\/strong> in SFCC\u2014they apply to the entire product and do not influence variant resolution.<\/p><\/li><\/ul><p>This separation allows CommerceTools to clearly distinguish between what identifies a variant and what describes a product.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-066b918 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"066b918\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ec4bc8 elementor-widget elementor-widget-heading\" data-id=\"3ec4bc8\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">\ud83d\uded2 Cart and Checkout Flow<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a2d86b elementor-widget elementor-widget-html\" data-id=\"5a2d86b\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<table>\r\n  <thead>\r\n    <tr>\r\n      <th>Capability<\/th>\r\n      <th>SFCC<\/th>\r\n      <th>CommerceTools<\/th>\r\n    <\/tr>\r\n  <\/thead>\r\n  <tbody>\r\n<tr>\r\n      <td><strong>Cart Modification<\/strong><\/td>\r\n      <td>Via pipelines\/controllers or SCAPI<\/td>\r\n      <td>Atomic operations via API (addLineItem, removeLineItem)<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Coupon Handling<\/strong><\/td>\r\n      <td>Promotion engine with coupons<\/td>\r\n      <td>Discount codes + Cart Discounts via rules<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Custom Logic<\/strong><\/td>\r\n      <td>Custom hooks, pipelines, controllers<\/td>\r\n      <td>Can trigger AWS Lambda (or similar) via API extension hooks<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Committing Cart<\/strong><\/td>\r\n      <td>SubmitOrder or SCAPI call creates order<\/td>\r\n      <td>Explicit transition via API: cart \u2192 order<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Inventory Check<\/strong><\/td>\r\n      <td>Real-time check via inventory list \/ ATS<\/td>\r\n      <td>API-based channel inventory per SKU<\/td>\r\n    <\/tr>\r\n  <\/tbody>\r\n<\/table>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b7f62c7 elementor-widget elementor-widget-text-editor\" data-id=\"b7f62c7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-pm-slice=\"1 1 []\">\ud83d\udccc <strong>Big Shift<\/strong><\/p>\n<p>In SFCC, cart and checkout behavior is controlled by embedded logic such as hooks and pipelines, which run inside the platform. In CommerceTools, this logic is <strong>externalized<\/strong>. You use <strong>API Extensions<\/strong> to trigger custom logic via HTTP calls before changes are committed\u2014like validating a cart or syncing an order. This shift enables greater flexibility but also requires your team to manage cloud functions or middleware.<\/p>\n<h5>\ud83d\udd27 How to Add Custom Logic in Cart\/Checkout (CommerceTools)<\/h5>\n<p>In SFCC, developers rely on <strong>hooks<\/strong> (<code>beforePOST<\/code>, <code>modifyGET<\/code>, etc.) to intercept or inject logic into the cart and checkout flows. CommerceTools takes a different approach.<\/p>\n<p>To customize or extend cart\/checkout behavior:<\/p>\n<ul data-spread=\"false\">\n<li>\n<p>Use <strong>API Extensions<\/strong> to register <strong>event-driven triggers<\/strong> on specific resources (e.g., cart creation, order creation)<\/p>\n<\/li>\n<li>\n<p>These triggers can call an external service like an <strong>AWS Lambda<\/strong>, <strong>GCP Cloud Function<\/strong>, or <strong>HTTP webhook endpoint<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>For example:<\/p>\n<ul data-spread=\"false\">\n<li>\n<p>On <code>order.created<\/code>, you could trigger a webhook that syncs to an ERP<\/p>\n<\/li>\n<li>\n<p>On <code>cart.changed<\/code>, validate inventory or inject promotions<\/p>\n<\/li>\n<\/ul>\n<p>There is <strong>no direct inline logic execution<\/strong> within CommerceTools like SFCC hooks. Instead, CT encourages <strong>decoupled, serverless logic<\/strong> that lives in your infrastructure.<\/p>\n<h5>\u2705 Pro Tip:<\/h5>\n<p>Use CommerceTools\u2019 <a href=\"https:\/\/docs.commercetools.com\/api\/projects\/api-extensions\" target=\"_blank\" rel=\"noopener\">API Extension mechanism<\/a> to replicate SFCC-style logic points. These extensions:<\/p>\n<ul data-spread=\"false\">\n<li>\n<p>Can intercept changes before they&#8217;re committed to the DB (e.g., validate a cart before save)<\/p>\n<\/li>\n<li>\n<p>Allow asynchronous workflows (e.g., trigger webhook on order create)<\/p>\n<\/li>\n<li>\n<p>Provide language-agnostic flexibility via HTTP<\/p>\n<\/li>\n<\/ul>\n<p>Unlike SFCC\u2019s inline controller logic or hook files, CommerceTools encourages decoupling core logic into cloud-native or external services.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a1d5188 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"a1d5188\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bab0037 elementor-widget elementor-widget-heading\" data-id=\"bab0037\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">\ud83d\udc64 Customer Management &amp; Sessions<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1122ed6 elementor-widget elementor-widget-html\" data-id=\"1122ed6\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<table>\r\n  <thead>\r\n    <tr>\r\n      <th>Feature<\/th>\r\n      <th>SFCC<\/th>\r\n      <th>CommerceTools<\/th>\r\n    <\/tr>\r\n  <\/thead>\r\n  <tbody>\r\n    <tr>\r\n      <td><strong>Customer Types<\/strong><\/td>\r\n      <td>Registered or Guest<\/td>\r\n      <td>Registered or Anonymous<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Login<\/strong><\/td>\r\n      <td>Handled via OCAPI\/SCAPI or storefront login<\/td>\r\n      <td>OAuth2 password grant or token-based login APIs<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Session Tokens<\/strong><\/td>\r\n      <td>SCAPI uses bearer tokens (SLAS); OCAPI uses cookie\/session<\/td>\r\n      <td>OAuth2 bearer tokens with expiration and refresh flows<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Customer Scope<\/strong><\/td>\r\n      <td>Scoped per site (login required on each)<\/td>\r\n      <td>Global to project; can filter\/group using custom fields<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Password & Reset<\/strong><\/td>\r\n      <td>Storefront flows or OCAPI<\/td>\r\n      <td>Handled via Customer API or Compose Frontend login flows<\/td>\r\n    <\/tr>\r\n    <tr>\r\n      <td><strong>Custom Attributes<\/strong><\/td>\r\n      <td>Defined in Business Manager<\/td>\r\n      <td>Typed custom fields defined on customer schema<\/td>\r\n    <\/tr>\r\n  <\/tbody>\r\n<\/table>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e14134a elementor-widget elementor-widget-text-editor\" data-id=\"e14134a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-pm-slice=\"1 1 []\">\ud83d\udccc <strong>Clarification for SFCC Developers:<\/strong><\/p>\n<p>Both platforms use OAuth-based bearer tokens to authenticate and authorize customer requests. You pass the token with every API call, and both support guest (anonymous) and registered customer flows.<\/p>\n<p><strong>In SFCC<\/strong>, SLAS (Shopper Login and API Access Service) is available only with SCAPI\u2014not OCAPI. It provides a managed identity layer that handles token issuance, refresh, expiration, and device activation flows. For OCAPI, authentication is handled through client credentials configured with specific roles.<\/p>\n<p><strong>In CommerceTools<\/strong>, the authentication flow is standards-based (OAuth2), but you manage token storage, refresh, and lifecycle within your frontend or middleware (e.g., <strong>Composable Frontend<\/strong>, the official frontend framework offered by CommerceTools, formerly known as Frontastic).<\/p>\n<p>\ud83d\udd38 So, for most implementations, the developer experience is <strong>functionally similar<\/strong>, especially with the right framework. The key difference is that CommerceTools doesn\u2019t provide a proprietary session management layer like SLAS\u2014you either roll your own or adopt a tool that does.<\/p>\n<p>\ud83d\udccc <strong>Developer Note:<\/strong> There\u2019s no Business Manager-style UI to manage customer data in CommerceTools\u2014you\u2019ll likely build your own admin interface or connect a 3rd-party system via API.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-edfb04b elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"edfb04b\" data-element_type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-db3074b elementor-widget elementor-widget-heading\" data-id=\"db3074b\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Wrapping Up: From SFCC to Composable Thinking<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b983a8d elementor-widget elementor-widget-text-editor\" data-id=\"b983a8d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-pm-slice=\"1 1 []\">CommerceTools removes the concept of site-specific logic and server-side pipelines. Instead, it gives you <strong>clean APIs, well-defined resources, and full flexibility to assemble your stack<\/strong> using modern frontend, backend, and middleware technologies.<\/p>\n<p>As an SFCC veteran, you&#8217;ll likely miss some out-of-the-box conveniences (e.g., Business Manager tools or controller-based flows), but you&#8217;ll gain far more in terms of <strong>architecture flexibility, speed, and future-proofing<\/strong>.<\/p>\n<p>\ud83e\udde0 <strong>Mindset Shift:<\/strong> CommerceTools expects you to <strong>think API-first<\/strong>, not console-first. Most platform capabilities\u2014including product, cart, checkout, and even promotions\u2014are driven by APIs, not by built-in tools or wizards. While the Merchant Center provides some UI for business users, serious customization happens outside the box.<\/p>\n<p>In fact, CommerceTools is designed to <strong>act as a modular commerce engine<\/strong>\u2014just one part of your broader digital commerce stack. You may combine it with a custom frontend (like Composable Frontend), third-party CMS, payment processor, or tax engine, all loosely coupled via API.<\/p>\n<p>This modular, API-first mindset is key to unlocking the power of composable commerce.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>If you\u2019ve spent years building storefronts, integrations, or backend logic in Salesforce Commerce Cloud (SFCC) using OCAPI, SCAPI, and Business [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":199,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[17],"tags":[19,20,18],"class_list":["post-160","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ecommerce-platforms","tag-commercetools","tag-salesforce-b2c-commerce","tag-sfcc"],"_links":{"self":[{"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/posts\/160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/comments?post=160"}],"version-history":[{"count":53,"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/posts\/160\/revisions"}],"predecessor-version":[{"id":219,"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/posts\/160\/revisions\/219"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/media\/199"}],"wp:attachment":[{"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/media?parent=160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/categories?post=160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tech-freaks.com\/wp-json\/wp\/v2\/tags?post=160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}