dist/codex/salesforce-commerce/skills/sf-b2c-pwa-kit/SKILL.md
Build headless B2C storefronts with PWA Kit — React-based framework (NOT Remix/Next.js), Managed Runtime deployment, Commerce SDK integration, server-side rendering, Chakra UI components, and extensible application shell. Use when building headless Salesforce Commerce storefronts.
npx skillsauth add orcaqubits/agentic-commerce-claude-plugins sf-b2c-pwa-kitInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Fetch live docs:
https://developer.salesforce.com/docs/commerce/pwa-kit-managed-runtime/overview for PWA Kit documentationsite:github.com SalesforceCommerceCloud pwa-kit for source, examples, and starter templatessite:developer.salesforce.com pwa-kit commerce-sdk for Commerce SDK integrationsite:developer.salesforce.com pwa-kit managed-runtime deployment for deployment docsWhy: PWA Kit versions, Commerce SDK hooks, and Managed Runtime deployment procedures change across releases. Always verify the version in use (v2 vs v3+) before generating code.
PWA Kit is Salesforce's React-based framework for headless B2C Commerce:
| Aspect | Detail | |--------|--------| | Framework | React with custom SSR (NOT Remix, NOT Next.js) | | Hosting | Managed Runtime (Salesforce CDN/edge) or self-hosted Node.js | | API Layer | Commerce SDK -- typed access to SCAPI (Shopper APIs) | | Authentication | SLAS (Shopper Login and API Access Service) | | UI Library | Chakra UI (accessible, themeable components) | | Extensibility | Override templates/components without forking |
pwa-kit-storefront/
├── app/
│ ├── pages/ # Route-based page components
│ ├── components/ # Shared React components
│ ├── hooks/ # Commerce SDK React hooks
│ └── routes.jsx # Centralized route definitions
├── config/default.js # Site config (API credentials, locales)
└── ssr.js # SSR server entry point
| Concept | Description |
|---------|-------------|
| Data Fetching (v2) | getProps static method on page components -- runs server-side on initial load |
| Data Fetching (v3+) | withReactQuery and React Query hooks replace getProps |
| Routing | Centralized in app/routes.jsx (NOT file-based like Next.js); React Router syntax |
| SSR | Custom server-side rendering via ssr.js; hydration on client |
| Commerce SDK Hooks | useProduct, useCategories, useBasket, useCustomer, useSearchParams |
| Chakra UI | Box, Flex, Grid, Stack for layout; responsive array syntax fontSize={['sm', 'md']} |
| SLAS Auth | Guest tokens (automatic), registered login (OAuth), token refresh (transparent via SDK) |
routes.jsx.getServerSideProps.getProps; v3+ uses React Query. Check package.json before coding..env in production.The Commerce SDK is configured in config/default.js with Commerce API credentials (clientId, organizationId, shortCode, siteId). These values come from environment variables in production. The SDK handles SLAS authentication, token refresh, and SCAPI proxy routing transparently.
| Hook | Purpose | Returns |
|------|---------|---------|
| useProduct(id) | Fetch product by ID | Product object with variants, images, prices |
| useCategories(id) | Fetch category tree | Category with subcategories |
| useBasket() | Cart management | Basket object with line items, totals |
| useCustomer() | Customer profile | Customer data, authentication state |
| useSearchParams() | Search and filtering | Search results with facets, pagination |
Fetch live docs for current hook signatures -- return types and parameters evolve across SDK versions.
Routes are defined explicitly in app/routes.jsx using React Router syntax. Page components in app/pages/ are NOT auto-discovered. Each route maps a URL pattern to a component with optional data fetching.
// Pattern: route definition skeleton
// Fetch live docs for current route config API
const routes = [
{ path: '/', component: Home, exact: true },
{ path: '/product/:productId', component: ProductDetail },
]
| Phase | Description |
|-------|-------------|
| Server render | ssr.js processes the request; getProps (v2) or React Query (v3+) fetches data |
| HTML delivery | Fully rendered HTML sent to browser with embedded state |
| Client hydration | React hydrates the server-rendered HTML and attaches event handlers |
| Client navigation | Subsequent navigation is client-side via React Router |
| Target | Method |
|--------|--------|
| Managed Runtime | npm run push -- -m "message" via CLI; global CDN, auto-SSL, environment management |
| Self-hosted | Any Node.js host (AWS, Heroku, Vercel); manual SCAPI proxy configuration needed |
Managed Runtime environments: development, staging, production. Each environment has independent configuration in Runtime Admin.
Override templates and components without forking the base:
Chakra UI is the default component library. Customize via extendTheme():
fontSize={['sm', 'md', 'lg']} maps to breakpoints.# Pattern: create new PWA Kit project
# Fetch live docs for current CLI options
npx @salesforce/pwa-kit-create-app
// Pattern: page component skeleton
// Fetch live docs for current data fetching API
const MyPage = ({ data }) => <Box>{data.name}</Box>
export default MyPage
config/default.js environment-aware; never hardcode API credentials.getProps or React Query) -- never useEffect for initial data.Fetch the PWA Kit docs, Commerce SDK reference, and Managed Runtime deployment guide for exact component APIs, SDK method signatures, and configuration options before implementing.
development
Build with Spree's headless Next.js storefront — the official `spree/storefront` repo (Next.js 16 App Router with Server Actions and Turbopack, React 19 Server Components, Tailwind CSS 4, TypeScript 5, `@spree/sdk`, Sentry), server-only auth (httpOnly JWT cookies + publishable key), MeiliSearch faceted catalog, one-page checkout with Apple/Google Pay/Klarna/Affirm/SEPA, multi-region market routing, GA4 + JSON-LD SEO, and Vercel/Docker deployment. Use when forking or customizing the storefront, or evaluating headless adoption.
tools
Build Spree extensions as Rails engines — gem scaffolding, `bin/rails g spree:extension`, mounting routes/migrations/assets, the modern `prepend` decorator pattern (`*_decorator.rb` with `self.prepended(base)`), generators (`spree:model_decorator`, `spree:controller_decorator`), the four customization surfaces in preference order (Events > Webhooks > Dependencies > Decorators), Spree::Dependencies for swapping service objects, gem release/versioning, and the deprecated Deface engine. Use when building a reusable Spree extension or adding non-trivial customization to an app.
development
Build with Spree's event bus and Webhooks 2.0 — `Spree::Events` publication, `Spree::Subscriber` DSL with `subscribes_to` and `on`, wildcard matching, lifecycle events (`{model}.created/.updated/.deleted` via `publishes_lifecycle_events`), the canonical event catalog (order.*, payment.*, shipment.*, product.*), Webhooks 2.0 endpoints, HMAC-SHA256 signing (`X-Spree-Webhook-Signature`), exponential-backoff retries, and Sidekiq job orchestration. Use when wiring event-driven business logic, building webhook consumers, or replacing ActiveSupport callback chains.
tools
Cross-cutting Spree development patterns — the customization preference hierarchy (Events > Webhooks > Dependencies > Decorators), `Spree::Dependencies` service-object swapping, the `_decorator.rb` + `prepend` + `self.prepended` idiom, idempotent subscribers and webhook receivers, multi-store scoping discipline, prefixed IDs, calculator polymorphism (shipping/promotion/tax share the base), service-object composition with `dry-monads` or simple results, why to avoid `class_eval` reopening and Deface, and Spree-on-Rails idioms (Hotwire/Turbo Stimulus, ActiveStorage, Action Cable, Sidekiq). Use when designing the architecture of a Spree extension or solving cross-cutting concerns.