Skip to content

Good-Better-Best Configuration

Good-Better-Best (GBB) lets a Smart Quote product return three complete configured choices from one configuration. A customer or salesperson compares the choices, selects one tier, and adds only that tier to the Sales Quote or Sales Order.

Each tier is a complete configuration snapshot. It can have its own price, benefits, bill of materials, routing, lead time, dimensions, documents, notes, and availability result.

Define the company catalog

An administrator first defines the reusable benefit and fence vocabulary under Setup > Good-Better-Best catalog. Catalog entries have stable codes, customer-facing names and descriptions, display order, and active status.

  • Benefits explain value included in a tier, such as premium support or faster delivery.
  • Fences describe a limitation or exclusion, such as a restricted service region.

Products refer to these company-level entries by code. This keeps wording consistent while allowing a product to override display text when necessary.

Enable GBB for a product

Open the product in Smart Quote setup, enable Good-Better-Best, and add a design set. A design set defines its priority, applicability, and the Good, Better, and Best tiers. Products that still use the legacy FEATURE=GOOD_BETTER_BEST tag remain compatible during migration.

Use the product matrix editor to configure each tier:

  • Assign benefits and fences from the company catalog.
  • Mark each fence as a limitation or exclusion.
  • Set its SKU label and configured, factor, or override pricing mode.
  • Restrict the design set by vertical, region, customer type, flags, or configuration attributes.

Empty applicability fields mean unrestricted. When multiple sets apply, the configurator selects the highest-priority set deterministically. Use Preview to review counts and pricing, save the matrix, and then open the runtime configurator preview.

Produce the tiers in rules

Set the price and configuration state for a tier before calling its GBB function. The function captures the current state as an independent snapshot.

// Good
config.Price.Bom.Set(100m);
config.Physical.Weight.Set(10m);
config.Gbb.Good("Core features");

// Better
config.Price.Bom.Set(150m);
config.Physical.Weight.Set(20m);
config.Gbb.Better("Faster delivery");

// Best
config.Price.Bom.Set(225m);
config.Physical.Weight.Set(30m);
config.Gbb.Best("Premium support");

Rules remain responsible for producing each tier's configured BOM, routing, and calculated values. The product definition supplies the tier composition, reusable benefit and fence references, applicability, and optional pricing policy. Existing calls to config.Gbb.Good, Better, and Best remain valid.

Define all three tiers. Validation rejects a GBB result when Good, Better, or Best is missing, an option is duplicated, or an option has no configured BOM or routing content. Rule-provided benefit strings remain a compatibility fallback, but the configurator warns when they are used after a product definition exists.

Changing the configuration after Good is captured does not rewrite the Good snapshot. This allows later rules to add materials, tasks, price, or other tier-specific details before capturing Better and Best.

Configurator experience

The configurator displays Good, Better, and Best in a comparison matrix. Each column can show:

  • Price and structured benefits
  • Fence limitations and exclusions
  • BOM item count
  • Routing time
  • Lead time
  • Availability and configuration details

The user must select exactly one card before finishing. Pricing, availability, documents, notes, and scheduling shown during finish come from the selected option.

Ordinary products continue to use the existing single-result configurator screen and finish routes.

Quote and order behavior

Finishing a GBB configuration adds one ordinary line item: the selected tier. Related line items produced by the configuration are still added through the existing quote and order behavior.

The persisted selected line includes:

Property Purpose
ConfigurationSetID Identifies the option set that produced the line
ConfigurationOptionKey Records good, better, or best
GBB display snapshot Preserves the resolved tier label, benefits, and fences for historical quotes

These fields provide reporting and grouping provenance. Replacing a choice keeps the set ID and records the new option key. Duplicating a line creates a new line ID and retains its provenance. Deleting the line affects only that persisted line because the unselected options are never persisted.

API contract

ConfigurationResultModel keeps the existing LineItem, RelatedLineItems, and computed LineItems contract. GBB results additionally populate LineItemSets.

{
  "configurationID": "CONFIG-123",
  "lineItem": {
    "description": "Compatibility preview"
  },
  "relatedLineItems": [],
  "lineItemSets": [
    {
      "setID": "CONFIG-123:gbb",
      "kind": 1,
      "behavior": 1,
      "options": [
        {
          "key": "good",
          "label": "Good",
          "displayOrder": 1,
          "benefits": ["Core features"],
          "lineItem": {}
        },
        {
          "key": "better",
          "label": "Better",
          "displayOrder": 2,
          "benefits": ["Faster delivery"],
          "lineItem": {}
        },
        {
          "key": "best",
          "label": "Best",
          "displayOrder": 3,
          "benefits": ["Premium support"],
          "lineItem": {}
        }
      ]
    }
  ]
}

kind: 1 means Good-Better-Best and behavior: 1 means Choose One. Consumers should continue using the original line-item fields when lineItemSets is empty.

Validate a selection with:

POST /v1/configure/{productID}/configuration/selection
Content-Type: application/json
{
  "configuration": {
    "configurationID": "CONFIG-123",
    "productID": "PRODUCT-123"
  },
  "setID": "CONFIG-123:gbb",
  "optionKey": "better"
}

The API regenerates the configuration and verifies the set ID and option key server-side. Quote and order finish requests carry the selected key in Configuration.LineItemSetSelections. Unknown sets, unknown options, and missing Choose One selections are rejected.

Rollout checklist

  • Define stable company benefit and fence codes.
  • Enable GBB and create a design set on the intended test product.
  • Assign tier benefits, fences, applicability, and pricing in the matrix.
  • Define and validate all three tier snapshots.
  • Confirm each tier's price, BOM, routing, lead time, and benefits.
  • Select each tier and add it to a test quote and order.
  • Confirm only the selected tier is persisted and related lines remain present.
  • Confirm ordinary products still finish through the single-result flow.
  • Expand the product tag rollout after validation succeeds.