# Commerce Store vs Storefront: Technical Reference

## Overview

Understanding the distinction between Commerce Store and Storefront is critical for successful Commerce B2B development. This document provides technical details about these two components and explains why they must be created in a specific order.

---

## The Two Components

### 1. Commerce Store (Backend Data)

**What it is:**
- Runtime data and configuration created in the Salesforce org
- NOT source-controllable metadata
- Created through Commerce app UI

**What it includes:**
- Store configuration and settings
- Default buyer groups (associated with Accounts)
- Entitlement policies (who can see which products)
- Pricing policies and price book mappings
- Payment gateway configuration (Stripe, Adyen, etc.)
- Tax provider configuration (Avalara, Vertex, manual)
- Shipping methods and configurations
- Product catalog associations
- Inventory locations
- Search index configurations

**Where it lives:**
- Data records in standard Commerce objects:
  - `WebStore` - Store settings and configuration
  - `BuyerGroup` - Account-based buyer segments
  - `EntitlementPolicy` - Product visibility rules
  - `CommerceEntitlementProduct` - Product-policy associations
  - `ProductCatalog` - Catalog definitions
  - `Pricebook2` - Price books
  - Additional payment, tax, shipping records

**How to create:**
- Via UI: Setup → Commerce → Stores
- Cannot be created via Metadata API
- Cannot be deployed via `sf project deploy`

---

### 2. Storefront (Frontend Metadata)

**What it is:**
- Digital Experience (LWR site) for buyer-facing shopping experience
- Source-controllable as ExperienceBundle metadata
- Created automatically when you create a Commerce Store

**What it includes:**
- ExperienceBundle metadata (`StorefrontName.digitalExperience-meta.xml`)
- URL routing configuration (`sfdc_cms__route`)
- Page definitions (`sfdc_cms__view`)
  - Homepage
  - Product List Pages (PLP)
  - Product Detail Pages (PDP)
  - Shopping cart
  - Checkout flow
  - Order confirmation
  - Search results
- Lightning Web Components (product cards, cart components, checkout)
- Branding and theme configuration (`sfdc_cms__brandingSet`, `sfdc_cms__theme`)
- Page layouts (`sfdc_cms__themeLayout`)
- Navigation structure
- Custom LWCs for extensions

**Where it lives:**
- `force-app/main/default/digitalExperiences/site/StorefrontName/`
- Example: `force-app/main/default/digitalExperiences/site/My_B2B_Store1/`

**How to create:**
- Automatically generated by Commerce Store setup wizard
- Retrieved from org using Salesforce CLI
- Cannot be manually created from scratch

**How to deploy:**
- Retrievable: `sf project retrieve start -m DigitalExperienceBundle:site/<name>`
- Deployable: `sf project deploy start -m DigitalExperienceBundle`
- Source-controllable in Git

---

## Why You Cannot Create Storefront Metadata from Scratch

### Technical Reasons

1. **Complex Dependency Chain**
   - Create merchandisers store
   - Create DigitalExperienceBundle
   - Integrate both together

2. **Hundreds of Auto-Generated Configurations**
   - Component IDs and region IDs (UUIDs)
   - WebStore associations
   - Commerce-managed component configurations
   - Default routing rules
   - Search configurations
   - Cart and checkout flow definitions
   - Payment integration settings

3. **Commerce-Managed Components**
   - Product List Page (PLP) components
   - Product Detail Page (PDP) components
   - Cart components
   - Checkout components
   - Search components
   - These require specific configurations from Store data

4. **Metadata API Limitation**
   - Metadata API deploys metadata types (Apex, LWCs, objects)
   - Metadata API CANNOT create SObject data (WebStore records)
   - Store creation requires data operations, not metadata operations

---

## The Required Creation Order

### Step 1: Create Commerce Store (Must Be First)

```
User Interface (Commerce App)
     ↓
WebStore Record Created
     ↓
BuyerGroup Records Created
     ↓
EntitlementPolicy Records Created
     ↓
Digital Experience Auto-Generated
     ↓
Commerce Components Configured
```

**Why this must be first:**
- Generates WebStore record with unique ID
- Creates default configurations
- Auto-generates associated Digital Experience
- Configures Commerce component relationships
- Sets up default buyer access rules

### Step 2: Retrieve Storefront Metadata

```
sf org list metadata --metadata-type DigitalExperienceConfig
     ↓
Select Store from List
     ↓
sf project retrieve start -m DigitalExperienceBundle:site/<name>
     ↓
Metadata Saved to Local Repository
     ↓
Now Editable and Source-Controllable
```

---

## Key Takeaway

**Commerce B2B = Store (data) + Storefront (metadata)**

1. Create Store → generates Storefront
2. Retrieve Storefront → customize and version control if needed
3. Deploy Storefront → only after creating Store in target org

**Never skip the Store creation. Never create Storefront metadata from scratch.**
