Serialized Gold / Rose Gold as Separate Products
| Date | 2026-03-26 |
| Status | Accepted |
| Decision Makers | @benjaminW78 |
| Supersedes | Extends 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:
- 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. - 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
| Source | Regular Serialized | Gold | Rose Gold |
|---|---|---|---|
| TCG CSV name | (Serialized) | (Serialized) (Gold) | (Serialized) (Rose Gold) |
| TCG CSV extNumber | 1144 | 1144 | 1144 |
| SWU API variantType | Serialized Prestige | [] (empty) | [] (empty) |
| SWU API image hint | Carb_C | Carb_C_Gold | Carb_C_Rose_Gold |
| Official FFG name | Serialized | Yellow Gold | Rose 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
- New finishes + separate products: Add
Serialized GoldandSerialized Rose Goldto the finish enum. OverridegeneratePrintingGroupKeyto prevent merging with regular Serialized. - New finishes, merged product: Add the finishes but keep them merged in one product. Accept that only one image is shown.
- 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 Name | Parsed Suffix | Variant | Finish |
|---|---|---|---|
Card Name (Serialized) | Serialized | Prestige | Serialized |
Card Name (Serialized) (Gold) | Serialized Gold | Prestige | Serialized Gold |
Card Name (Serialized) (Rose Gold) | Serialized Rose Gold | Prestige | Serialized 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
| File | Key Symbols | Role |
|---|---|---|
packages/games/game-configuration/src/lib/games/swu/swu.types.ts | StarWarsUnlimitedFinish | New enum values |
packages/games/game-configuration/src/lib/game-configuration.types.ts | CardFinish | Cross-game finish enum |
packages/games/game-importer/src/swu-importer.ts | generatePrintingGroupKey, parseTcgProductName, findApiCardMatch | Grouping override, compound parsing, API matching |
packages/games/game-importer/src/swu-staging-importer.ts | generatePrintingGroupKey | Mirrors grouping override |
packages/games/game-importer/src/base-importer.ts | flattenAndGroupPrintings | Uses this.generatePrintingGroupKey() for slug generation |
packages/games/game-importer/src/staging-base-importer.ts | flattenAndGroupPrintings | Passes 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
undefinedwhen no match is found, avoiding wrong enrichment
Negative
- The
generatePrintingGroupKeyoverride must be duplicated in both the normal and staging importers (they don’t share a common SWU base class) - The
staging-base-importerandbase-importerneeded minor changes to passfinishesthrough 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