AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach for reading public data from Salesforce Commerce Cloud (SFCC/SFRA) storefronts. It focuses on using public endpoints, sitemaps, and storefront navigation to capture product catalogs, category structures, and site content without requiring Business Manager or OCAPI credentials. The guide outlines how to handle regional settings, identify product variations, and manage content assets, while establishing a clear process for data inventory and policy rule extraction for subsequent migration steps.
What it does
- Identifies public SFCC storefront endpoints for catalog and content discovery.
- Provides rules for parsing sitemaps and navigating storefront structures.
- Defines methods for extracting product variations, pricing, and stock status.
- Outlines procedures for capturing site policies and content pages.
- Establishes a framework for recording regional settings and currency data.
- Structures the hand-off process for mapping and cutover requirements.
When to use it
- When you need to extract product and content data from an SFCC storefront.
- When you lack administrative access to the target store's Business Manager or OCAPI.
- When preparing for a site migration from SFCC to another platform.
- When you need to document site policies and regional configurations from public sources.
Advantages
- Enables data extraction without requiring sensitive administrative credentials.
- Provides a consistent methodology for handling SFCC-specific storefront patterns.
- Includes clear guidelines for managing missing or ambiguous data points.
- Supports a structured, resumable approach to site crawling and data capture.
Usage examples
- “How do I identify the product catalog on an SFCC site without OCAPI access?”
- The skill instructs you to use the site's robots.txt to find sitemaps and to crawl category pages using the Search-ShowAjax controller to build a comprehensive product list.
- “How should I handle product options that are hidden on the storefront?”
- The guide suggests comparing product data across different pages to identify custom fields that indicate visibility, or recording the status as unknown for manual review.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/wix/rp-source-sfcc/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip rp-source-sfcc.zip -d .agents/skills
Documentation by Wix
rp-source-sfcc
Technique guide for reading a public SFCC/SFRA storefront. It ships no capture code:
rp-discovery follows its "no adapter exists → capture manually, same output contract"
path, and you write the capture code for each migration as generated project code under
migrations/<project>/src/, with its outputs in migrations/<project>/data/sfcc-discovery/.
⚠️ Nothing site-specific (code, ids, values, fixtures) is ever added to this skill.
Recognize the platform
Pipeline URLs:
/on/demandware.store/Sites-<site>-Site/<locale>/<Controller>. The homepageog:urloften uses one, which gives you the site id and the default locale.Static assets:
/on/demandware.static/.... Image renditions:/dw/image/v2/<REALM>_<ENV>/....OCAPI (
/s/<site>/dw/shop/...,/s/-/dw/data/...) answers401without credentials. Don't ask for Business Manager or OCAPI credentials in this flow; record them as a later phase. UsesourceMode=public_content.
Files to read first
robots.txt. Obey it for every request, and take the sitemap index from it.Sitemaps (index →
sitemap_N.xml). These list products, categories and<image:loc>originals. ⚠️ Sitemaps are incomplete. Pre-order products and variant SKUs are commonly missing, some listed products aren't searchable, and some*.htmlentries are content assets or malformed. Never treat the sitemap as the catalog.The homepage, plus a few category and product pages. Read the header, navigation, footer and
hreflanglinks. The homepage may have nohreflang, so learn the locale routes from inner pages before you crawl.
Public storefront endpoints (SFRA)
| Need | Endpoint / source | Notes |
|---|---|---|
| Category id | Category page markup (cgid) | Links carry it percent-encoded: decode it once, then encode it once when you build a request |
| Category members | Search-ShowAjax?cgid=<id>&start=<n>&sz=<page> | Page until resultCount is reached. Tiles are div.product[data-pid] with the PDP link. A zero-result listing is not a category |
| Full product model | Product-Variation?pid=<id>&quantity=1 → JSON {product} | The main source: sales and list price, variationAttributes with every value, options, availability, min/max order quantity, descriptions, images with alt text, promotions, plus the store's own custom fields. It is a storefront controller, not a contracted API |
| Variant siblings | Product-Variation?pid=<master>&dwvar_<master>_<attr>=<value> | The master id appears in the value urls. A master alone returns 404. Accept a value only when the response marks that value selected; selectable: false values may not be fetchable |
| Fallback | PDP schema.org JSON-LD (Product, BreadcrumbList) | It holds only the sales price and a flattened availability, so a record built from it lists the missing fields as unobserved |
| SEO and redirect source | PDP/category <title>, meta description, og:*, canonical | Detect template-generated SEO versus SEO set per item. Store paths decoded. A path is a redirect source, never a Wix slug |
The product set is the union of the grid tiles from every category (including categories linked only from the navigation) and the sitemap's product URLs. Key products by SFCC product id, not by URL: locale renditions have their own canonicals.
Signals that are easy to misread
Product types. Variation attributes create SKUs (Wix variant options). SFCC product options (e.g. engraving) change the price, not the SKU, so they are Wix modifiers. Keep them in separate fields.
Option visibility. An option can be attached to a product but hidden on the storefront: its markup is present but hidden. SFRA has no standard visibility flag. Find the store's own custom field by comparing products where the option is shown and where it isn't. If you can't find one, record visibility as unknown and never drop the option.
Stock. The values are
inStock,preorder(withinStockDate, which only means a date when the status ispreorder), and out of stock (often no status at all, only a message).lowStockCountandmaxOrderQuantityare hints, never authoritative quantities.Prices.
price.listis the compare-at price.promotions[]names promotion ids but never their rules.callForPricehides the price and add-to-cart: that needs a human decision.Images. The original is the static path: drop
/dw/image/v2/<REALM>_<ENV>and the query string. Largersw/shrenditions are upscales.Ratings can be an aggregate number with no reviews behind it, which can't be imported as reviews.
Videos may be opaque ids whose host is not exposed.
Regional settings (currency, language, country)
Record the store's regional facts from the public pages, read-only. Time zone is not exposed
publicly: leave it unknown (not-exposed).
Currency: the price currency code on product pages: the
Product-VariationJSON price (price.sales.currency) or the PDP JSON-LDoffers.priceCurrency. Sample products from every locale route you saw.Language and locale region: the default locale in the pipeline URL (
Sites-<site>-Site/<locale>/, e.g.en_US) and thehreflanglinks. The language is the two-letter part (en) andlocaleis theen-UStag. Otherhreflanglanguages remain adapter discovery evidence rather than fields in the neutral locale record.Several price currencies (locale routes priced in different currencies): preserve the list in SFCC discovery evidence and leave
paymentCurrencyunknown with reasonambiguous, unless the person names the base one, which is then asuppliedvalue. Never pick one from the default locale alone.A value you cannot read is
unknownwith a reason (not-exposed,unreadable,ambiguous), never a guess or a default.
Build the file with buildSourceRegional (adapter sfcc; evidence names the page or field the
value came from) and write it with writeSourceRegional from lib/source-regional.js to
discovery/source-locale.json. There is no promote step for this public path.
Scan the other pages
Product and category pages are covered by the capture above. Everything else (about, shipping, returns, FAQ, legal, store locator, forms, gift certificates, loyalty) is usually linked only from the header and footer.
Seeds:
the homepage;
every link harvested from product and category pages;
every default-locale sitemap URL the catalog capture did not claim (content assets and
Page-Showpages often appear only there).
Rules:
Stay on the same host, follow
robots.txt, and skip the alternate-locale prefixes.Admit content routes:
Page-Show?cid=<id>(SFRA content assets), Page Designer pages,Stores-Find(store locator), and ordinary*.htmlor extensionless content paths.Skip only these: assets; query variants of an already-seen page; catalog routes the capture owns (
Product-*,Search-*); and action or AJAX routes (Cart-*,Checkout*,Account-*,Login-*,Order-*,Wishlist-*,*-Ajax*, formPOSTtargets). ⚠️ Never skip a whole controller family that isn't on this list. Record it for review instead.Give every URL a disposition (
captured,covered-by-catalog,skipped:<reason>orfailed:<status>) indata/sfcc-discovery/page-inventory.json. Re-runs re-attemptfailed.
For each captured page, read its content and propose the Wix destination: a static page, CMS items, a form, pickup locations, a gift-card product, or a manual or dropped item. Policy prose such as free-shipping thresholds, delivery times, VAT wording or the return window is evidence for Wix settings, not settings.
Quote it verbatim into
data/sfcc-discovery/policy-rules.json, withstatus: candidate.Never fill in a value the text doesn't state.
Have the user confirm each rule, including threshold boundaries, shipping option titles and delivery estimates. Store their verbatim answer and set
status: confirmedbefore anything is written to Wix.
Be polite and resumable
Keep one throttle for every request (start around 60 per minute), use a bounded timeout, and retry
429/503honoringRetry-After.Checkpoint as you go, so a re-run resumes and re-attempts only failures. Refresh prices and stock just before import.
Decode URLs tolerantly: a malformed
%must not abort the run.
Hand-off (existing artifacts only)
Each stage writes only its own part, through the contracts that already exist:
| Stage (producer) | Writes | Read by |
|---|---|---|
Capture code (migrations/<project>/src/) | Raw data, page-inventory.json, policy-rules.json under data/sfcc-discovery/ | rp-discovery |
rp-discovery | source-schema.json (catalog entities, site_page, confirmed rules as site_policy_rule, gaps in sourceMeta) and the "Gaps" section of source-profile.md, naming each cutover item below | rp-mapper |
rp-mapper | mapping/mapping-plan.json, including each routed entity's urlPolicy; one mapping/review/mapping-gaps.json row per cutover item | rp-setup-discovery, rp-import-codegen |
rp-setup-discovery | One setup/setup-requirements.json entry per cutover item (automation: manual or blocked, the requirementId below, recommendedAction) | The website handoff (setupContract.manualBlockers) |
| Generated import code | URL state in state/url-preservation/, through lib/url-preservation-state.js (below) | Resume, redirect planning, cutover |
URL state, each file in its own role:
base-paths.json: entity-level route intent from mappingurlPolicy.url-ledger.ndjson: one append-only row per public record (source URL, planned and actual target).redirects.ndjson: only when both relative URLs are known and differ.unresolved.ndjson: only URLs still waiting on a route decision, a target lookup or manual review.A preserved URL (same relative path) closes with no redirect.
Cutover items:
requirementId | Trigger | Owner → action | Resolves when |
|---|---|---|---|
sfcc-redirects | Planned redirects.ndjson rows exist | Cutover Operator → enter them in Wix when the domain moves (there is no redirect API) | Each planned old URL lands on its target after cutover |
sfcc-page-build:<path> | A captured page with no automatic destination, or an unresolved.ndjson manual_review page | Cutover Operator → build the page from its captured content, or mark it dropped, before launch | The page is published at its target URL (then its ledger row and redirect follow), or a recorded drop decision exists |
sfcc-policy-unconfirmed:<domain> | A rule still candidate in policy-rules.json | Requires Import Operator → "Confirm or reject the candidate rules in data/sfcc-discovery/policy-rules.json with the merchant, then re-run mapping and setup for site_policy_rule" | Every rule is confirmed (with the Wix setting read back) or rejected, each with the merchant's verbatim answer |
sfcc-call-for-price | A product that hides its price | Requires Import Operator → "Ask the merchant how each call-for-price product should sell on Wix, record the answer, and re-import those products" | A recorded answer, and the products read back in that state |
sfcc-option-visibility | Option visibility is unknown | Requires Import Operator → "Confirm which add-on options shoppers can buy, then re-import the affected products" | A recorded answer, and the options read back |
sfcc-partial-variants:<master> | Unresolved variant values | Requires Import Operator → "Re-run the capture to re-attempt them; ask the merchant whether any remaining values are retired" | Every value is resolved or recorded as retired |
sfcc-authenticated-data | Always, on a public-only run | Cutover Operator → tell the merchant that promotion rules, real inventory, customers, orders, gift-certificate balances and offline products need Business Manager access later | A recorded merchant acknowledgement, or the later authenticated pass is complete |
sfcc-alternate-locale:<locale> | Locale renditions seen but not captured | Cutover Operator → tell the merchant that locale isn't migrated yet | A recorded merchant acknowledgement, or a later locale pass is complete |
⚠️ No cutover UI reads these yet. They are preserved for it, not wired to it.
Files
- ATTRIBUTION.mdAdded by AutoGineer840 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md12.6 KiB
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Wix
- Publisher
- Wix (Official)
- Source
- wix/skills · skills/wix-replatform/resources/rp-source-sfcc · commit d168bc2
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Wix.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download rp-source-sfcc.zip