{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-developer-portal/system-integration/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown","redocly_category":"Integrations","owner":"MB"},"seo":{"title":"Product Import Guide","description":"How to correctly map and import products into Norce Commerce. Covers required fields, product types, flags, logistics fields, parametrics, and variantization.","keywords":"technical, recommended-practice, storm-connect, guide, system-integration, product, import, mapping, parametrics, flags, variants"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"product-import-guide"},"children":["Product Import Guide"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The product import is the most complex and consequential import in a Norce integration. Mistakes here can cause silent data corruption, products that never appear on the storefront, or shipping logic that doesn't work. This guide covers the decisions you need to make correctly before writing a single line of import code."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["API Reference:"]}," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/api-reference/connect/productservice/openapi/product/importproducts"},"children":["ImportProducts"]},{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Header reference:"]}," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/api-reference/connect/productservice/x-stormconnect-header-product"},"children":["ProductHeader"]}," — ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/working-with-the-stormconnect-header"},"children":["Working with the X-Stormconnect-Header"]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"the-product-model"},"children":["The product model"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Norce uses a three-level product hierarchy:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"Product\n  └── Variant (also called Variant Cluster)\n        └── SKU\n"},"children":[]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Product"]}," — the top-level entity. Holds the manufacturer, shared content (name, description), categories, and product-level parametrics."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Variant"]}," — groups SKUs that share the same physical form. Holds ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerPartNo"]},", logistics data, and variant-level parametrics (e.g. color, size)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["SKU"]}," — the orderable unit. Has ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PartNo"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Status"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Type"]},", price, and on-hand data."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For products without variants, the hierarchy still exists — there is simply one variant with one SKU."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"required-fields-to-create-a-product"},"children":["Required fields to create a product"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A product import that is missing any of these will either fail or produce a product that cannot function correctly in Norce."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Level"},"children":["Level"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Why it is required"},"children":["Why it is required"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerCode"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Identifies the manufacturer. Together with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerPartNo"]},", forms the unique product key. Must exist in Norce — see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/metadata-integrations"},"children":["Metadata Integrations"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Variant"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerPartNo"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Together with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerCode"]},", uniquely identifies a variant. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["This pair must be globally unique across your entire product catalog."]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PartNo"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The orderable product identifier used throughout the system — in orders, on-hand records, and price lists. Can be omitted to let Norce generate it — see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#letting-norce-generate-partno"},"children":["Letting Norce generate PartNo"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Status"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Required on creation. Controls the product lifecycle. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#product-statuses"},"children":["Product statuses"]}," below."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Required on creation. Controls how Norce handles the product in orders and stock. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#product-types"},"children":["Product types"]}," below."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Primary category"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Every product must have a category with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IsPrimary: true"]},". Without it, default VAT, delivery settings, and category-based parametrics will not apply."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"the-manufacturercode--manufacturerpartno-uniqueness-rule"},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerCode"]}," + ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerPartNo"]}," uniqueness rule"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is one of the most common sources of silent data corruption in product integrations."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Norce uses ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerCode"]}," + ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerPartNo"]}," as a composite key to identify a variant. If two products in your import have the same combination, ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["one of them will overwrite the other"]}," without any error or warning — and since import is an async batch process, the order of processing is not guaranteed. You will end up with one product where you expected two."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This situation typically occurs when:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your source system uses manufacturer part numbers inconsistently or allows duplicates"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Multiple sources use the same manufacturer part number for different products"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Data is migrated from a legacy system without deduplication"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Always validate uniqueness of this pair before sending the import."]}," If your source data contains duplicates, you must resolve them (by adjusting one of the values) before importing."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"letting-norce-generate-partno"},"children":["Letting Norce generate PartNo"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PartNo"]}," can be omitted when creating a product. If manufacturer information is present and all other required fields are provided, Norce will generate a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PartNo"]}," automatically according to the numbering scheme configured in the Admin UI. This is a reliable way to ensure uniqueness — if you are not importing a pre-existing article number from a source system, letting Norce generate the number avoids the risk of collisions."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once generated, the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PartNo"]}," is permanent and cannot be changed. Subsequent imports must reference the assigned ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PartNo"]}," to update the product."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"product-statuses"},"children":["Product statuses"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Status controls the product lifecycle in Norce. Use the appropriate status — do not model your own lifecycle using flags if a built-in status fits."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Status"},"children":["Status"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Value"},"children":["Value"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Active"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Fully published and purchasable"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Coming"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["2"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Not yet published. Use this as the initial status when creating products — let content enrichment and manual activation move it to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Active"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Expiring"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Being phased out. Norce closes the product when stock is depleted"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Hidden"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["4"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Not visible on the storefront but can still be ordered"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Inactive"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["5"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Deactivated"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["NotActivated"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["6"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Created but not yet fully configured"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Recommended practice:"]}," Set new products to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Coming"]}," on creation using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["StatusCreateOnly"]}," in the header (code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["22"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SkuFieldsThatAreSet"]},"). This prevents the ERP from overwriting a status that has been manually changed to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Active"]}," in the Admin UI on subsequent imports. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/working-with-the-stormconnect-header#scenario-5-create-only-fields"},"children":["Working with the X-Stormconnect-Header"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"product-types"},"children":["Product types"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Type controls how Norce handles a product in the ordering and stock flow. Choosing the wrong type is a common mistake that affects order processing, stock display, and ERP integration."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Value"},"children":["Value"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Use when"},"children":["Use when"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ErpStandard"]}," (also called Standard in Admin UI)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A regular product managed in an ERP. Norce sends orders for this product to the ERP order receiver. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["This is the standard type for most ERP-integrated products."]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManagedErpPackage"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["38"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A bundle of ERP products sold together."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManagedStructure"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["37"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A bundle or kit product assembled from other SKUs within Norce."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Service"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["11"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A non-physical service product. No stock tracking."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["License"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["33"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A software license product."]}]}]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Note on naming:"]}," In the Norce Admin UI and in some older contracts and documentation, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ErpStandard"]}," may appear as simply ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Standard"]},". These refer to the same type (value ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1"]},"). Type value ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["14"]}," (formerly a distinct \"Standard\" type for non-ERP products) has been deprecated and removed — only value ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1"]}," remains in use."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The most common mistake"]}," is selecting the wrong product type for your fulfillment setup. If your ERP is the order fulfillment system, all physical sellable products must be ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ErpStandard"]}," — otherwise Norce will not send the order to your ERP when the product is purchased."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For an overview of all product types and their current usage in Norce, see the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/user-portal/pim/product-types"},"children":["Product types reference in the user portal"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"built-in-fields-vs.-parametrics"},"children":["Built-in fields vs. parametrics"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is one of the most consequential mapping decisions in a product integration. Some product attributes have dedicated built-in fields in Norce's data model. Putting these into parametrics means the data is there visually, but Norce's business logic cannot use it."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"fields-that-must-be-built-in-not-parametrics"},"children":["Fields that must be built-in (not parametrics)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["These fields feed Norce's shipping and logistics calculations. They only work when mapped to the correct built-in SKU or variant fields."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Attribute"},"children":["Attribute"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Level"},"children":["Level"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Header code"},"children":["Header code"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Actual weight (kg)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ActualWeight"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Variant"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SkuFieldsThatAreSet [14]"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Dangerous goods flag"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IsDangerousGoods"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Variant"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VariantFieldsThatAreSet [3]"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Logistic width (mm)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LogisticWidth"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SkuFieldsThatAreSet [16]"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Logistic height (mm)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LogisticHeight"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SkuFieldsThatAreSet [18]"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Logistic depth (mm)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LogisticDepth"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SkuFieldsThatAreSet [19]"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["EAN/barcode"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["EanCode"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SkuFieldsThatAreSet [5]"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Commodity code"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CommodityCode"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SkuFieldsThatAreSet [4]"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Unit of measurement"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["UnitOfMeasurementType"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SkuFieldsThatAreSet [7]"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VolumeWeight"]}," (formerly code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["15"]},") is deprecated and no longer supported. Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ActualWeight"]}," and the logistic dimension fields instead — Norce calculates volumetric weight from those."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For the full list of built-in product fields and their semantics, see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/user-portal/pim/product-settings"},"children":["Product settings"]}," in the user portal."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"fields-that-should-be-parametrics"},"children":["Fields that should be parametrics"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Everything else that is product-specific but does not feed a built-in Norce calculation belongs as a parametric. Examples:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Technical specifications (wattage, voltage, material, dimensions in a product data sheet)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Color and size (when used as variant-defining attributes)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Certifications and compliance markings"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Product-specific delivery or assembly notes"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Parametrics are flexible, multilingual, and filterable. They are the right place for any attribute that buyers use to compare or filter products."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"product-flags"},"children":["Product flags"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Flags are boolean attributes — set or not set. Unlike parametrics, flags apply to all products in the catalog regardless of category. This makes them the right tool for cross-cutting concerns that span many product types."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Norce also has built-in business logic that can act on flags — such as filtering search results, triggering workflows, or controlling feature availability. Flags are therefore useful for integrations that need to signal state to Norce or to downstream storefront logic."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"common-flag-use-cases"},"children":["Common flag use cases"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Multi-market publishing"]}," — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IsPublishedSweden"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IsPublishedNorway"]},", etc. A product's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Status"]}," is global across all markets, but a flag group can express per-market visibility independently. This is a very common pattern for merchants selling to multiple countries."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Campaigns and seasonal products"]}," — flag a product as part of a campaign or as a seasonal item. Useful for driving storefront merchandising logic without changing the product's lifecycle status."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Enrichment workflow triggers"]}," — an integration can set a flag on newly created products to signal that they need manual enrichment in the PIM. Workflow tooling can then filter on this flag and clear it when enrichment is complete."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Assortment classification"]}," — for example, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IsMarketplaceEligible"]}," or an ABC inventory classification flag. These typically come from the ERP or a separate business process."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Special offers and agreements"]}," — flag products that have a special price agreement, or that are available for backorder."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"flags-vs.-statuses--when-to-use-which"},"children":["Flags vs. statuses — when to use which"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Use"},"children":["Use"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Correct approach"},"children":["Correct approach"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product is published and purchasable"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Status = Active"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product is being phased out"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Status = Expiring"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product is published in a specific market"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Flag: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IsPublished[Market]"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product is a clearance item"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Flag: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IsOnClearance"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product is in a current campaign"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Flag: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IsInCampaign"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product requires age verification"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Flag: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AgeRestricted"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product is available for backorder"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Flag: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IsBackorderAvailable"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product needs enrichment attention"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Flag: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["NeedsEnrichment"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product is eligible for a marketplace"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Flag: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IsMarketplaceEligible"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The key distinction: ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Norce statuses control the product lifecycle"]}," — they affect visibility, stock behavior, and order processing in ways that are built into the platform. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Flags are yours to define"]}," and carry meaning in your business logic, storefront code, and workflows."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Do not create a flag to replicate what a Norce status already does. Do not use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Status"]}," to express a business concept that belongs in a flag."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Flags must be created in Norce before products referencing them are imported. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/metadata-integrations#product-flags-and-flag-groups"},"children":["Metadata Integrations"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"variantization"},"children":["Variantization"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Variants model products that come in multiple configurations — sizes, colors, capacities — where each configuration is a separately orderable product with its own ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PartNo"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"you-do-not-have-to-variantize-at-import-time"},"children":["You do not have to variantize at import time"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["It is entirely valid to import products as flat, unvariantized SKUs and leave variantization to be done later in Norce's PIM. Nothing is lost data-wise — the products are created correctly, and a content team can group them into variants in the Admin UI afterwards."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Variantizing through the import makes sense when your source system already carries reliable variant grouping information. If the grouping information is ambiguous or inconsistent in the source data, it is often safer to import flat and structure variants deliberately in Norce."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"when-variant-structure-can-be-inferred-from-the-source"},"children":["When variant structure can be inferred from the source"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Some source systems express variant relationships through naming conventions rather than explicit grouping. For example, article numbers with a shared prefix and variant-specific suffixes (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SHIRT-BLK-S"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SHIRT-BLK-M"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SHIRT-RED-S"]},") carry the grouping implicitly. In this case, the integration can:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Parse the common prefix as the base product identity — use this as the shared ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Product.Code"]}," stem"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Identify the suffix values as the variant dimensions (color, size)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create or reference the corresponding ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VariantDefinitionGroup"]}," in Norce"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Assign each SKU to the correct variant within the group"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This kind of inference logic belongs in the integration layer, not in Norce. The output is a standard variant import — Norce just receives correctly structured data."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"mapping-from-a-source-system-with-variants"},"children":["Mapping from a source system with variants"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If your ERP or PIM has a variant concept, map it as follows:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Source system concept"},"children":["Source system concept"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Norce concept"},"children":["Norce concept"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product family / product group"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Product (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Product.Code"]},")"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Variant / article within family"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Variant (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerPartNo"]},")"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Orderable SKU / article number"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SKU (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PartNo"]},")"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Variant-defining attribute (size, color)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Variant definition / variant group"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"variant-groups"},"children":["Variant groups"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The dimensions that define variants — size, color — are configured as a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VariantDefinitionGroup"]}," in Norce. When a variant definition group is referenced on the product, Norce knows which parametrics are the variant-defining ones and can present them correctly in the storefront and Admin UI."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VariantDefinitionGroup"]}," is not strictly required for the product hierarchy to exist — you can import a product with multiple variants without one, and the structure will be created. However, without it there is no context telling Norce or the storefront which parametric represents color versus size. This works but is not common practice. Whenever you have resolved that a set of products vary by color, size, or another defined dimension, you should create or look up the correct ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VariantDefinitionGroup"]}," and reference it in the import."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create and manage variant groups via the Management API — see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/metadata-integrations#variant-groups"},"children":["Metadata Integrations"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"the-product-code-and-variant-structure"},"children":["The product code and variant structure"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Code"]}," field on the product level signals to Norce that this product is part of a variant family — that the product-variant structure is intentional and more variants may be added later. If you import a product with a single variant and a single SKU and include a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Code"]},", Norce treats it as a variant-structured product. If you omit ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Code"]},", Norce treats it as a standalone product."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In practice:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["If you know a product will have multiple variants, or you expect more variants to be added later — set a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Code"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["If you know this is a single-SKU product with no variants — leave ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Code"]}," out."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["If you are unsure — leave it out until you need it."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"products-without-variants"},"children":["Products without variants"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Even a product with no variant dimensions has one variant and one SKU in Norce's model. In this case:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerPartNo"]}," on the variant equals the product's own identifier from the source system"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["There is exactly one SKU with its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PartNo"]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"import-contract-restrictions"},"children":["Import contract restrictions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImportProducts"]}," handles product structure, content, and basic pricing — but two types of data are intentionally excluded from the contract:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["On-hand (stock)"]}," — stock figures are never included in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImportProducts"]},". They are always a separate import via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImportOnHands"]},". Products must exist in Norce before on-hand records can be created for them. If your source data includes both product information and stock levels, split them into two separate imports and ensure the product import runs first."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Multiple price lists"]}," — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImportProducts"]}," supports only one price list per call. If you need to populate multiple client price lists, use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImportSkuPriceLists"]}," as a separate import. Like on-hand, price list records require the products to already exist. A common approach is a thin first pass (product structure and creation) followed by separate parallel imports for on-hand and all price lists."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"a-multi-step-import-strategy"},"children":["A multi-step import strategy"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The completeness of a product record in Norce often grows in stages. Trying to do everything in one import call makes the integration fragile and hard to debug."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A practical approach:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Thin first import"]}," — the mandatory keys and built-in settings. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerCode"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerPartNo"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PartNo"]}," (or let Norce generate it), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Status"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Type"]},", primary category, and any built-in fields like logistics dimensions, EAN, and unit of measurement. Built-in fields are lightweight and have no performance impact, so including them here rather than in a later pass is fine. The goal of this step is to ensure all products exist with correct keys before anything else depends on them."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Content and enrichment imports"]}," — the heavy metadata-defined structures: product names, descriptions, images, parametrics, flags, and variant grouping. These involve large metadata-dependent structures and are often maintained by a separate PIM or DAM system. They can run after products are created and can be re-run incrementally as content matures."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["On-hand and price imports"]}," — once products exist, these can run independently of each other and independently of step 2. They do not need to wait for content enrichment — the only hard dependency is that the products themselves are created."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This structure makes each import leaner, more debuggable, and easier to retry selectively when something goes wrong."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"validating-your-product-import"},"children":["Validating your product import"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Start by checking the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Connect job status"]},". Every import returns a job ID — check it in the Admin UI under Integration Status, or subscribe to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["JobCompletedEvent"]},". A completed job with errors tells you which records failed and why without needing to query individual products. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/job-check-examples"},"children":["Job integration examples"]}," for programmatic job status polling."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once the job has completed successfully, use Norce Commerce Query for targeted spot checks. Query is designed for application use and can be expensive for large result sets — use it for sampling and specific lookups, not for iterating through every product in a large import."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"/ProductSkus?$filter=PartNo in ('SKU001', 'SKU002', 'SKU003')&$select=PartNo,Status,Type,ManufacturerCode\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Spot checks to run:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Primary category is set: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/ProductSkus('SKU001')?$expand=Categories($filter=IsPrimary eq true)"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Status and Type are what you intended"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Parametrics are present: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["?$expand=Parametrics"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Logistics fields are set: check ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ActualWeight"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LogisticWidth"]}," etc. on the variant"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"further-reading"},"children":["Further reading"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/api-reference/connect/productservice/openapi/product/importproducts"},"children":["ImportProducts API reference"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/api-reference/connect/productservice/x-stormconnect-header-product"},"children":["ProductHeader specification"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/working-with-the-stormconnect-header"},"children":["Working with the X-Stormconnect-Header"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/metadata-integrations"},"children":["Metadata Integrations"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/products-and-pricing-integrations"},"children":["Products and pricing integrations"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/product-integration-scenarios"},"children":["Product integration scenarios"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/product-integration-examples"},"children":["Product integration examples"]}]}]}]},"headings":[{"value":"Product Import Guide","id":"product-import-guide","depth":1},{"value":"The product model","id":"the-product-model","depth":2},{"value":"Required fields to create a product","id":"required-fields-to-create-a-product","depth":2},{"value":"The ManufacturerCode + ManufacturerPartNo uniqueness rule","id":"the-manufacturercode--manufacturerpartno-uniqueness-rule","depth":3},{"value":"Letting Norce generate PartNo","id":"letting-norce-generate-partno","depth":3},{"value":"Product statuses","id":"product-statuses","depth":2},{"value":"Product types","id":"product-types","depth":2},{"value":"Built-in fields vs. parametrics","id":"built-in-fields-vs.-parametrics","depth":2},{"value":"Fields that must be built-in (not parametrics)","id":"fields-that-must-be-built-in-not-parametrics","depth":3},{"value":"Fields that should be parametrics","id":"fields-that-should-be-parametrics","depth":3},{"value":"Product flags","id":"product-flags","depth":2},{"value":"Common flag use cases","id":"common-flag-use-cases","depth":3},{"value":"Flags vs. statuses — when to use which","id":"flags-vs.-statuses--when-to-use-which","depth":3},{"value":"Variantization","id":"variantization","depth":2},{"value":"You do not have to variantize at import time","id":"you-do-not-have-to-variantize-at-import-time","depth":3},{"value":"When variant structure can be inferred from the source","id":"when-variant-structure-can-be-inferred-from-the-source","depth":3},{"value":"Mapping from a source system with variants","id":"mapping-from-a-source-system-with-variants","depth":3},{"value":"Variant groups","id":"variant-groups","depth":3},{"value":"The product code and variant structure","id":"the-product-code-and-variant-structure","depth":3},{"value":"Products without variants","id":"products-without-variants","depth":3},{"value":"Import contract restrictions","id":"import-contract-restrictions","depth":2},{"value":"A multi-step import strategy","id":"a-multi-step-import-strategy","depth":2},{"value":"Validating your product import","id":"validating-your-product-import","depth":2},{"value":"Further reading","id":"further-reading","depth":2}],"frontmatter":{"seo":{"title":"Product Import Guide","description":"How to correctly map and import products into Norce Commerce. Covers required fields, product types, flags, logistics fields, parametrics, and variantization.","keywords":"technical, recommended-practice, storm-connect, guide, system-integration, product, import, mapping, parametrics, flags, variants"},"metadata":{"redocly_category":"Integrations","owner":"MB"}},"lastModified":"2026-07-10T06:04:35.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/developer-portal/system-integration/product-import-guide","userData":{"isAuthenticated":false,"teams":["anonymous"]}}