Skip to Content
Game ImportersStar Wars: UnlimitedArchitecture Decision RecordsSerialized Gold / Rose Gold as Separate Products

Serialized Gold / Rose Gold as Separate Products

Date2026-03-26
StatusAccepted
Decision Makers@benjaminW78
SupersedesExtends Variant/Finish Model and TCGPlayer Suffix-Based Parsing

Context and Problem Statement

Starting with Secrets of Power, FFG introduced replacement serialized Prestige cards with distinct metallic color treatments — Yellow Gold and Rose Gold — as part of a duplicate serialized card replacement program. TCGPlayer lists these as separate products with compound suffixes: (Serialized) (Gold) and (Serialized) (Rose Gold).

This creates two challenges:

  1. Parsing: The existing suffix parser only handles single parenthesized suffixes like (Serialized). The compound format (Serialized) (Gold) was unrecognized, causing these products to default to Standard/Normal.
  2. Product grouping: All three serialized tiers (regular, Gold, Rose Gold) share the same extNumber (e.g., 1144) from TCG CSV. The default finish-agnostic grouping merges them into one product, but they have visually distinct card images (different metallic colors) and different market values.

Data Sources

SourceRegular SerializedGoldRose Gold
TCG CSV name(Serialized)(Serialized) (Gold)(Serialized) (Rose Gold)
TCG CSV extNumber114411441144
SWU API variantTypeSerialized Prestige[] (empty)[] (empty)
SWU API image hintCarb_CCarb_C_GoldCarb_C_Rose_Gold
Official FFG nameSerializedYellow GoldRose Gold

Decision Drivers

  • Gold and Rose Gold cards have visually distinct images (different metallic colors on the serialized stamp)
  • TCGPlayer treats them as separate products with independent pricing
  • The SWU API has entries for them but with empty variantTypes — not yet properly categorized
  • The product model stores one image per product — no per-finish image support
  • FAB already sets a precedent for keeping finishes as separate products when they have distinct identities (Cold Foil vs Rainbow Foil via print ID suffixes)

Considered Options

  1. New finishes + separate products: Add Serialized Gold and Serialized Rose Gold to the finish enum. Override generatePrintingGroupKey to prevent merging with regular Serialized.
  2. New finishes, merged product: Add the finishes but keep them merged in one product. Accept that only one image is shown.
  3. Per-finish images: Extend the product model to store images keyed by finish. Keep them as one product.

Decision Outcome

Chosen option: New finishes + separate products (Option 1), because it requires no schema changes, follows the FAB precedent, and correctly represents that these are distinct marketplace products with different images and prices.

New Finish Enum Values

enum StarWarsUnlimitedFinish { NORMAL = "Standard", FOIL = "Foil", SERIALIZED = "Serialized", SERIALIZED_ROSE_GOLD = "Serialized Rose Gold", // NEW SERIALIZED_GOLD = "Serialized Gold", // NEW }

Compound Suffix Parsing

The parseTcgProductName() method was updated to extract all trailing parenthesized groups and try compound matching before single-suffix matching:

TCGPlayer NameParsed SuffixVariantFinish
Card Name (Serialized)SerializedPrestigeSerialized
Card Name (Serialized) (Gold)Serialized GoldPrestigeSerialized Gold
Card Name (Serialized) (Rose Gold)Serialized Rose GoldPrestigeSerialized Rose Gold

Product Grouping Override

The generatePrintingGroupKey() method is overridden in both StarWarsUnlimitedImporter and StarWarsUnlimitedStagingImporter to append the finish to the group key for Gold/Rose Gold. This prevents them from being merged with regular Serialized (which shares the same extNumber).

protected generatePrintingGroupKey(printing) { const baseKey = super.generatePrintingGroupKey(printing) const finish = printing.finishes?.[0] if (finish === SERIALIZED_GOLD || finish === SERIALIZED_ROSE_GOLD) { return `${baseKey}-${this.slugify(finish)}` } return baseKey }

SWU API Matching

Gold/Rose Gold entries in the SWU API have empty variantTypes. Matching uses image URL hints (_Gold_, _Rose_Gold_) with explicit exclusion to avoid substring false positives. If no match is found, undefined is returned (no enrichment) rather than falling through to a wrong candidate.

Impacted Files

FileKey SymbolsRole
packages/games/game-configuration/src/lib/games/swu/swu.types.tsStarWarsUnlimitedFinishNew enum values
packages/games/game-configuration/src/lib/game-configuration.types.tsCardFinishCross-game finish enum
packages/games/game-importer/src/swu-importer.tsgeneratePrintingGroupKey, parseTcgProductName, findApiCardMatchGrouping override, compound parsing, API matching
packages/games/game-importer/src/swu-staging-importer.tsgeneratePrintingGroupKeyMirrors grouping override
packages/games/game-importer/src/base-importer.tsflattenAndGroupPrintingsUses this.generatePrintingGroupKey() for slug generation
packages/games/game-importer/src/staging-base-importer.tsflattenAndGroupPrintingsPasses finishes through to grouping key and slug generation

Consequences

Positive

  • Each serialized tier gets its own product with its own image and price tracking
  • Follows the existing FAB precedent — no new patterns introduced
  • No schema changes required — uses the existing product model
  • Compound suffix parser is extensible for future multi-suffix patterns
  • SWU API matching gracefully returns undefined when no match is found, avoiding wrong enrichment

Negative

  • The generatePrintingGroupKey override must be duplicated in both the normal and staging importers (they don’t share a common SWU base class)
  • The staging-base-importer and base-importer needed minor changes to pass finishes through to the grouping key method, affecting shared code (though behavior is unchanged for all other games)
  • SWU API matching for Gold/Rose Gold relies on image URL patterns (_Gold_, _Rose_Gold_) which could change if the SWU API restructures its CDN paths
Last updated on