关于 sfcc-business-manager
sfcc-business-manager 是面向 SFCC 管理人员和开发者的操作指南,介绍如何通过 Business Manager 管理目录、站点设置、促销和作业。还涵盖 XML 批量导入导出及作业故障排查。
主要功能
- 01管理目录与产品数据
- 02配置站点偏好设置
- 03通过 XML 导入库存和价格
- 04配置并运行导入作业
- 05查看作业日志并排查问题
适用场景
- 01为新 SFCC 站点初始化目录
- 02从 ERP 或 PIM 导入产品数据
- 03为自定义 cartridge 设置站点偏好
- 04排查导入作业失败及错误日志
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill sfcc-business-manager安装后在 Claude Code 中输入/sfcc-business-manager确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
tile.jsonevals/catalog-xml-structure-and-variation-prod/criteria.jsontask.mdevals/import-job-automation-via-webdav-and-job/criteria.jsontask.mdevals/site-preferences-xml-and-cartridge-acces/criteria.jsontask.md详细介绍
SFCC Business Manager
概述
Business Manager(BM)是 SFCC 管理界面,可通过 https://{instance}.dx.commercecloud.salesforce.com/on/demandware.store/Sites-Site/default/ViewApplication-DisplayWelcomePage 访问。它控制 SFCC 安装的各个方面:目录和商品管理、站点首选项、促销引擎、内容资源、A/B 测试和作业计划。批量数据操作通过 Import & Export 框架使用 XML 导入/导出,该框架通过计划作业处理 IMPEX 目录中的文件。
何时使用此技能
- 为新的 SFCC 站点执行初始目录设置时
- 通过 XML 从 ERP 或 PIM 系统导入商品、价格或库存时
- 为 API 客户端注册配置 OCAPI 设置时
- 为自定义 cartridge 配置设置站点首选项时
- 跨站点管理促销、优惠券活动和 A/B 测试时
- 在 Business Manager 中诊断作业失败或查看导入错误日志时
核心说明
-
导航到 Business Manager 的关键区域
Business Manager URL 遵循以下模式:
{instanceUrl}/on/demandware.store/Sites-Site/default/{Controller-Action}:# Site Selection (global) /on/demandware.store/Sites-Site/default/ViewApplication-DisplayWelcomePage # Catalog Management (site-specific) /on/demandware.store/Sites-{SiteID}/default/ViewCategories-Start # Site Preferences /on/demandware.store/Sites-{SiteID}/default/ViewSitePreference-StartGroups # OCAPI Settings /on/demandware.store/Sites-Site/default/ViewApplicationApiSettings-Start # Import & Export /on/demandware.store/Sites-{SiteID}/default/ViewJobSchedule-Start # Job Execution /on/demandware.store/Sites-Site/default/ViewJobSchedule-Start -
通过 XML 目录导入商品
SFCC 目录 XML 遵循 Demandware 的
catalog.xsd架构。商品作为目录对象导入:<?xml version="1.0" encoding="UTF-8"?> <catalog xmlns="http://www.demandware.com/xml/impex/catalog/2006-10-31" catalog-id="your-catalog"> <category category-id="electronics"> <display-name xml:lang="x-default">Electronics</display-name> <display-name xml:lang="en-US">Electronics</display-name> <online-flag>true</online-flag> <parent>root</parent> </category> <product product-id="PROD-001"> <ean>1234567890123</ean> <upc>123456789012</upc> <display-name xml:lang="x-default">Wireless Headphones Pro</display-name> <display-name xml:lang="en-US">Wireless Headphones Pro</display-name> <long-description xml:lang="x-default">Premium wireless headphones with ANC</long-description> <online-flag>true</online-flag> <available-flag>true</available-flag> <searchable-flag>true</searchable-flag> <tax-class-id>standard</tax-class-id> <brand>AudioPro</brand> <manufacturer-sku>AP-WH-001</manufacturer-sku> <classification-category catalog-id="your-catalog">electronics</classification-category> <images> <image-group view-type="large"> <image path="products/PROD-001-large.jpg"/> </image-group> <image-group view-type="small"> <image path="products/PROD-001-small.jpg"/> </image-group> </images> <custom-attributes> <custom-attribute attribute-id="color">Black</custom-attribute> <custom-attribute attribute-id="batteryLife">30</custom-attribute> </custom-attributes> </product> <product product-id="SHIRT-MASTER"> <display-name xml:lang="x-default">Classic Cotton Shirt</display-name> <online-flag>true</online-flag> <classification-category catalog-id="your-catalog">apparel</classification-category> <variations> <attributes> <variation-attribute attribute-id="color" variation-attribute-id="color"> <display-name xml:lang="x-default">Color</display-name> <variation-attribute-values> <variation-attribute-value value="Blue"> <display-value xml:lang="x-default">Blue</display-value> </variation-attribute-value> <variation-attribute-value value="Red"> <display-value xml:lang="x-default">Red</display-value> </variation-attribute-value> </variation-attribute-values> </variation-attribute> <variation-attribute attribute-id="size" variation-attribute-id="size"> <display-name xml:lang="x-default">Size</display-name> <variation-attribute-values> <variation-attribute-value value="S"><display-value xml:lang="x-default">S</display-value></variation-attribute-value> <variation-attribute-value value="M"><display-value xml:lang="x-default">M</display-value></variation-attribute-value> <variation-attribute-value value="L"><display-value xml:lang="x-default">L</display-value></variation-attribute-value> </variation-attribute-values> </variation-attribute> </attributes> <variants> <variant product-id="SHIRT-BLUE-S"/> <variant product-id="SHIRT-BLUE-M"/> <variant product-id="SHIRT-RED-M"/> </variants> </variations> </product> <product product-id="SHIRT-BLUE-S"> <display-name xml:lang="x-default">Classic Cotton Shirt - Blue / S</display-name> <online-flag>true</online-flag> <variation-attribute-values> <variation-attribute-value attribute-id="color">Blue</variation-attribute-value> <variation-attribute-value attribute-id="size">S</variation-attribute-value> </variation-attribute-values> </product> <category-assignment category-id="electronics" product-id="PROD-001"> <primary-flag>true</primary-flag> </category-assignment> </catalog> -
导入库存和价格
<?xml version="1.0" encoding="UTF-8"?> <inventory xmlns="http://www.demandware.com/xml/impex/inventory/2007-05-31"> <inventory-list> <header list-id="your-inventory-list"> <default-in-stock>false</default-in-stock> <description>Main Inventory</description> </header> <records> <record product-id="PROD-001"> <allocation>150.00</allocation> <allocation-timestamp>2026-03-12T00:00:00.000Z</allocation-timestamp> <perpetual>false</perpetual> <preorderable>false</preorderable> <backorderable>false</backorderable> </record> <record product-id="SHIRT-BLUE-S"> <allocation>42.00</allocation> <perpetual>false</perpetual> </record> </records> </inventory-list> </inventory><?xml version="1.0" encoding="UTF-8"?> <pricebooks xmlns="http://www.demandware.com/xml/impex/pricebook/2006-10-31"> <pricebook> <header pricebook-id="usd-m-list-prices"> <currency>USD</currency> <display-name xml:lang="x-default">USD List Prices</display-name> <online-flag>true</online-flag> </header> <price-tables> <price-table product-id="PROD-001"> <amount quantity="1">149.99</amount> </price-table> <price-table product-id="SHIRT-BLUE-S"> <amount quantity="1">39.99</amount> </price-table> </price-tables> </pricebook> </pricebooks> -
为自定义 cartridge 设置配置站点首选项
站点首选项是在 Business Manager → Administration → Site Development → System Object Types → SitePreferences 中定义的自定义属性:
<?xml version="1.0" encoding="UTF-8"?> <metadata xmlns="http://www.demandware.com/xml/impex/metadata/2006-10-31"> <type-extension type-id="SitePreferences"> <custom-attribute-definitions> <attribute-definition attribute-id="myIntegration_apiEndpoint"> <display-name xml:lang="x-default">My Integration API Endpoint</display-name> <type>string</type> <mandatory-flag>false</mandatory-flag> <externally-managed-flag>false</externally-managed-flag> <min-length>0</min-length> <max-length>255</max-length> </attribute-definition> <attribute-definition attribute-id="myIntegration_enabledFlag"> <display-name xml:lang="x-default">My Integration Enabled</display-name> <type>boolean</type> <mandatory-flag>false</mandatory-flag> </attribute-definition> </custom-attribute-definitions> <group-definitions> <attribute-group group-id="MyIntegration"> <display-name xml:lang="x-default">My Integration Settings</display-name> <attribute attribute-id="myIntegration_apiEndpoint"/> <attribute attribute-id="myIntegration_enabledFlag"/> </attribute-group> </group-definitions> </type-extension> </metadata>在 cartridge ISML/控制器中访问:
// In SFCC ISML controller (server-side JS) var Site = require('dw/system/Site'); var currentSite = Site.getCurrent(); var apiEndpoint = currentSite.getCustomPreferenceValue('myIntegration_apiEndpoint'); var isEnabled = currentSite.getCustomPreferenceValue('myIntegration_enabledFlag'); -
配置并运行导入作业
SFCC 导入作业在 Business Manager → Administration → Operations → Jobs 中配置。作业使用放置在
/IMPEX/src/中或通过 Jobs API 上传的 XML Feed 文件:// Upload an XML file to IMPEX via OCAPI WebDAV before triggering job const importFile = fs.readFileSync('./catalog.xml'); // Upload via WebDAV (SFCC exposes IMPEX as WebDAV) const webdavUrl = `${instanceUrl}/on/demandware.servlet/webdav/Sites/Impex/src/catalog-import.xml`; await fetch(webdavUrl, { method: "PUT", headers: { Authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString("base64")}`, "Content-Type": "application/xml", }, body: importFile, }); // Trigger the import job via Jobs API const jobResponse = await fetch( `${instanceUrl}/s/-/dw/data/v23_2/jobs/sfcc-site-archive-import/executions`, { method: "POST", headers: { Authorization: `Bearer ${adminToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ parameters: [ { name: "ImportFile", value: "catalog-import.xml" }, { name: "catalogID", value: "your-catalog" }, ], }), } );
示例
导出订单以与 ERP 同步
// Paginated order export via OCAPI Data API
async function exportOrdersSince(sinceDate: string) {
const token = await getAdminToken();
const instanceUrl = process.env.SFCC_INSTANCE_URL!;
const siteId = process.env.SFCC_SITE_ID!;
let start = 0;
const count = 100;
const allOrders = [];
while (true) {
const response = await fetch(
`${instanceUrl}/s/${siteId}/dw/data/v23_2/order_search`,
{
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
query: {
filtered_query: {
query: { match_all_query: {} },
filter: {
range_filter: {
field: "creation_date",
from: sinceDate,
},
},
},
},
select: "(**)",
count,
start,
sorts: [{ field: "creation_date", sort_order: "asc" }],
}),
}
);
const { hits, total } = await response.json();
allOrders.push(...(hits ?? []));
start += count;
if (start >= total) break;
}
return allOrders;
}
通过 OCAPI 创建促销
async function createPromotion(promo: {
id: string;
name: string;
discountPercent: number;
startDate: string;
endDate: string;
}) {
const token = await getAdminToken();
const instanceUrl = process.env.SFCC_INSTANCE_URL!;
const siteId = process.env.SFCC_SITE_ID!;
await fetch(
`${instanceUrl}/s/${siteId}/dw/data/v23_2/promotions/${promo.id}`,
{
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
id: promo.id,
name: { default: promo.name },
enabled: true,
start_date: promo.startDate,
end_date: promo.endDate,
discount: {
type: "percentage",
value: promo.discountPercent,
},
promotion_class: "order",
}),
}
);
}
最佳实践
- 上传前根据 Demandware 架构验证 XML 导入文件——XSD 文件位于 Business Manager 的 Administration → Site Development → System Object Types 下;无效 XML 会静默失败,且不会提供逐行错误消息
- 为并发导入使用唯一的作业 ID——SFCC 的每个作业定义都以单线程方式运行;如果需要并行导入目录和库存,请使用多个作业定义
- 始终在目录 XML 中包含
catalog-id——目录 ID 不匹配或缺失会导致商品导入到错误的目录,或导入彻底失败 - 先在暂存环境测试导入,再导入生产环境——目录导入没有批量“撤销”功能;请先使用小规模子集进行测试
- 在 BM → Administration → Operations → Jobs 中监控作业日志——失败的作业会将日志写入
/IMPEX/log/;自动导入后请立即下载并检查日志 - 对所有本地化字符串使用
<display-name xml:lang="x-default">——必须使用x-default区域设置;缺少该设置会导致所有区域设置出现显示问题 - 通过导入 XML 设置站点首选项,而非手动设置——将所有自定义站点首选项值记录在提交到版本控制的 XML 文件中,以确保环境一致性
常见问题
| 问题 | 解决方案 |
|---|---|
| 已导入商品,但在店面中不可见 | 检查商品的 online-flag 是否为 true、类别分配是否已设置 primary-flag,以及站点目录是否已分配给当前站点 |
| 导入作业已完成,但日志显示“0 records processed” | 确认文件已上传到正确的 IMPEX 路径,并且作业的 ImportFile 参数与文件名完全一致,包括扩展名 |
| 自定义站点首选项未显示在 BM UI 中 | 确保已通过 BM → Administration → Site Development → Import & Export 导入 system-objecttype-extensions.xml,并已清除缓存 |
| 导入成功,但库存未更新 | 检查 XML 中的 inventory-list list-id 是否与 BM → Merchant Tools → Products and Catalogs 中分配给站点的库存列表相匹配 |
| OCAPI Data API 在触发作业时返回 403 | 客户端 ID 必须具有针对 jobs 资源的 Data API 权限;请在 BM → Administration → Site Development → OCAPI Settings → Data 中确认 |
| 显示默认目录价格,而非已导入的价格簿价格 | 在 BM → Merchant Tools → Pricing → Pricebooks 中将价格簿分配给站点客户组;已导入的价格簿在分配前不会生效 |
相关技能
- @sfcc-cartridge-development
- @sfcc-ocapi-scapi
- @catalog-management
- @product-import-export
- @promotion-engine