{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-solution-portal/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown","redocly_category":"Development","owner":"MB"},"seo":{"title":"Supplier Solution Design","description":"How the chosen supplier algorithm works, when to use extended assortment, and how to troubleshoot supplier integrations in Norce Commerce","keywords":"supplier integration, extended assortment, dropshipping, chosen supplier, penalty charges"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"supplier-solution-design"},"children":["Supplier Solution Design"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This article covers the parts of supplier integration that require design decisions: how the chosen supplier algorithm selects suppliers, when the extended assortment model is appropriate, and how to diagnose common integration failures."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For step-by-step setup, see the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/setup/suppliers"},"children":["Suppliers setup guide"]},". For the data model, field requirements, and import mechanics, see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/supplier-product-model"},"children":["The Supplier Product Model"]},". For integration milestones and flow diagrams, see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/supplier-integrations"},"children":["Supplier Integrations"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"the-chosen-supplier-algorithm"},"children":["The Chosen Supplier Algorithm"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When multiple suppliers offer the same product, Norce Commerce selects the preferred supplier — the \"chosen supplier\" — using the following criteria, evaluated in order:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The supplier has stock available"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The supplier has a valid price (connected price list with a cost value)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The supplier offers the lowest ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["penalized cost"]}," among those meeting criteria 1 and 2"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The chosen supplier drives cost-based pricing on the client price list, and is what the Query API returns at order time for dropshipping and extended assortment scenarios."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"penalty-charges"},"children":["Penalty charges"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Penalty charges let you discount certain suppliers in the selection algorithm without removing them. A supplier with a penalty will only win when it offers a meaningfully lower cost than alternatives."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The penalized cost is calculated as:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"penalizedCost = penaltyChargeAmount + (1 + penaltyChargePercentage / 100) × cost\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For example, a 10% penalty on a supplier with a cost of 100 gives a penalized cost of 110. That supplier is only chosen if no other supplier has a penalized cost below 110."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Penalty charges do not affect sale prices."]}," They only influence which supplier is selected. To adjust customer-facing prices, use supplemental charges on the client price list instead."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Penalty charges are configured per supplier in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Settings → Suppliers → [Supplier] → Penalty charges"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"lead-time"},"children":["Lead time"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Lead time (set per supplier warehouse) is displayed to customers as the estimated delivery time for supplier-sourced products. It does not affect which supplier is chosen — only penalty charges and pricing determine selection. Configure lead time to reflect each supplier's actual delivery performance."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"extended-assortment"},"children":["Extended Assortment"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Extended assortment lets you list and sell products that you do not hold in your own warehouse. The products exist in the supplier catalog and are made available on the storefront through Norce's Extended product type."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"the-deferred-creation-model"},"children":["The deferred creation model"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Extended products are not created in the ERP until the first sale. This is intentional:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The supplier catalog may contain thousands of products, most of which will never be ordered"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Creating ERP records for all of them upfront creates maintenance overhead and pollutes the ERP with dead stock"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Instead, Norce manages extended products internally until a sale occurs, at which point the ERP integration is triggered to create the product as a standard item and generate the purchase order"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This means the ERP integration must handle the case where an ordered item does not yet exist as a standard product. The order payload will include the extended product details needed for creation."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"activation-and-deactivation"},"children":["Activation and deactivation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Extended products automatically activate and deactivate based on supplier availability:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A product activates when at least one supplier has stock and a valid price"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A product deactivates when ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["all"]}," suppliers have either zero stock or no valid price — not just one"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["If a supplier later re-lists the product, it reactivates automatically"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Deactivated products remain in the system (hidden from storefronts) for reporting and reactivation"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Manual override is available if automatic status changes need to be suppressed for a specific product."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"when-to-use-extended-assortment"},"children":["When to use extended assortment"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Extended assortment is appropriate when:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["You want to offer a broader catalog than you stock, using supplier fulfillment"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ERP can handle deferred product creation (creating standard products at first sale)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["You have reliable supplier data feeds with accurate stock levels"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["It is not suitable when supplier data quality is low or the ERP cannot handle extended items in orders."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"dropshipping"},"children":["Dropshipping"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In Norce Commerce, dropshipping means an ordered product ships directly from the supplier to the end customer — it never passes through your warehouse."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Norce does not send purchase orders to suppliers. The ERP system is responsible for generating the purchase order and coordinating fulfilment. Norce's role is to provide the chosen supplier and supplier product reference at order time via the Query API."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the Query API at order time (not the imported catalog data) to get:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Which supplier is chosen for each ordered product"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The supplier's own part number (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SupplierPartNo"]},") to include in the purchase order"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Current pricing and lead time"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Relying on cached catalog data rather than the Query API is a common source of pricing discrepancies between quote and fulfilment."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"troubleshooting"},"children":["Troubleshooting"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"products-dont-appear-in-the-catalog-after-a-successful-supplier-import"},"children":["Products don't appear in the catalog after a successful supplier import"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The supplier products imported successfully, but nothing appears on the storefront. Check in order:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Manufacturer link is not formed"]}," — the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Manufacturer"]}," + ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ManufacturerPartNo"]}," pair in the supplier import must exactly match the values on the client product. Check for casing differences, whitespace, or a manufacturer mapping that hasn't been completed yet. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/supplier-product-model#common-link-failures"},"children":["The Supplier Product Model"]}," for details."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Creation rules are filtering the product out"]}," — if extended assortment creation rules are in place, verify the product passes the category and manufacturer filters configured in the rule."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Product status is set to pending"]}," — check the initial status setting in the creation rule. If set to pending, the product exists but is inactive."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Availability thresholds not met"]}," — if stock-based activation is configured, the supplier stock level may be below the threshold."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"pricing-at-order-time-differs-from-catalog-prices"},"children":["Pricing at order time differs from catalog prices"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The most common cause: the catalog price was calculated from an older import cycle, but the supplier has since updated their cost. Always use the Query API at order time to get current pricing — do not rely on the imported price list data for order fulfilment."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Other causes:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A margin rule is applied inconsistently (e.g. only on some price lists)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Currency conversion is applied at import but not at Query API lookup, or vice versa"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"the-wrong-supplier-is-being-chosen"},"children":["The wrong supplier is being chosen"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the chosen supplier selection seems incorrect:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Check that all competing suppliers have a connected price list with a current cost value — a supplier without a valid price is excluded from selection entirely"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Check penalty charge configuration — a supplier with high penalties may be losing to a more expensive but unpenalised supplier"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verify supplier warehouse stock levels are being updated correctly; a supplier with zero stock is excluded"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"a-product-stays-active-after-a-supplier-discontinues-it"},"children":["A product stays active after a supplier discontinues it"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The product will only deactivate when ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["all"]}," suppliers for that product have zero stock or invalid prices — not just the one that discontinued it. If the product has multiple suppliers, check whether any of the others still show stock. Use the Query API to inspect current chosen supplier state."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"products-reactivate-unexpectedly"},"children":["Products reactivate unexpectedly"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is expected behaviour when a supplier re-lists a product after a period of zero stock. If reactivation should not happen automatically, use a manual status override on the product."]}]},"headings":[{"value":"Supplier Solution Design","id":"supplier-solution-design","depth":1},{"value":"The Chosen Supplier Algorithm","id":"the-chosen-supplier-algorithm","depth":2},{"value":"Penalty charges","id":"penalty-charges","depth":3},{"value":"Lead time","id":"lead-time","depth":3},{"value":"Extended Assortment","id":"extended-assortment","depth":2},{"value":"The deferred creation model","id":"the-deferred-creation-model","depth":3},{"value":"Activation and deactivation","id":"activation-and-deactivation","depth":3},{"value":"When to use extended assortment","id":"when-to-use-extended-assortment","depth":3},{"value":"Dropshipping","id":"dropshipping","depth":2},{"value":"Troubleshooting","id":"troubleshooting","depth":2},{"value":"Products don't appear in the catalog after a successful supplier import","id":"products-dont-appear-in-the-catalog-after-a-successful-supplier-import","depth":3},{"value":"Pricing at order time differs from catalog prices","id":"pricing-at-order-time-differs-from-catalog-prices","depth":3},{"value":"The wrong supplier is being chosen","id":"the-wrong-supplier-is-being-chosen","depth":3},{"value":"A product stays active after a supplier discontinues it","id":"a-product-stays-active-after-a-supplier-discontinues-it","depth":3},{"value":"Products reactivate unexpectedly","id":"products-reactivate-unexpectedly","depth":3}],"frontmatter":{"seo":{"title":"Supplier Solution Design","description":"How the chosen supplier algorithm works, when to use extended assortment, and how to troubleshoot supplier integrations in Norce Commerce","keywords":"supplier integration, extended assortment, dropshipping, chosen supplier, penalty charges"},"metadata":{"redocly_category":"Development","owner":"MB"}},"lastModified":"2026-07-10T06:04:35.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solution-portal/detailed-design/supplier-design","userData":{"isAuthenticated":false,"teams":["anonymous"]}}