BlueShop Catalog Governance — As Built

What this showcase explains: a product moves from private draft work to a customer-visible assortment, then leaves the storefront without losing its governed history.

1. What BlueShop Delivers

Catalog managers build product facts privately, review readiness, publish the product into the live assortment and later withdraw it while retaining identity and history.

Before publicationDraft work stays customer-invisible.

Descriptions, price, category, brand, variants and media can be prepared without exposing an incomplete product.

After approvalThe product becomes eligible for customer discovery.

Catalog lifecycle and projected Stock availability together determine normal storefront search visibility.

Practical example: the Alpine Espresso System cannot be opened by a customer while Draft. After review and publication, the same URL resolves to an in-stock product page. Archive withdraws that page while Catalog retains the record and lifecycle.

2. Draft Becomes Customer Visibility

The existing film follows one product across the real Catalog backoffice and storefront with burned-in narration.

PRODUCT LIFECYCLE / 2M 15.24S

Draft, Review, Publish, Retire With Customer Impact

Shows the product hidden while Draft, prepared and reviewed in Catalog, published into the live storefront, then archived and withdrawn while its governed record remains available to staff.

01
Build privatelyThe product URL remains unavailable while the manager completes its commercial and descriptive facts.
02
Review and publishThe lifecycle records the review decision, then the same URL becomes a sellable product page.
03
Withdraw cleanlyArchive removes customer visibility while staff retain the product and its lifecycle history.

3. Archive Withdraws Without Erasing

A product can leave the assortment without deleting the business record that explains what happened.

4. Business Result

TECHNICAL DEEP DIVE

How catalog governance works

The sections below explain lifecycle flow, aggregate ownership, publication checks, event delivery, search visibility and current operating limits.

5. How Governance Moves

The lifecycle has one customer-facing direction and one withdrawal direction. Both keep Catalog as the owner of product identity and status.

Two straight flows show product preparation reaching the storefront and archive withdrawing it while retaining history
Publication makes a complete product eligible for discovery. Archive publishes a withdrawal fact so customer-facing projections remove it while Catalog retains the governed record.

6. Product Is the Consistency Boundary

Product lifecycle and child facts change together so a variant, image, price or relation cannot bypass aggregate-level rules.

Product owns identity, lifecycle, commercial and child facts while Category, Brand and Stock remain separate authorities feeding customer projections
The customer view combines several authorities without moving their ownership into Product. Search is derived and repairable; Stock remains authoritative for availability.
Inside Product ownershipBehavior protectedOwned elsewhere
SKU, localized content, price, dimensions and EANCommercial identity and publication completenessStock quantities and reservations remain Stock authority
Lifecycle, schedule and publish/archive timestampsActions, reasons and retained historySearch documents remain disposable read models
Variants, media, attributes, tags and relationsLimits, uniqueness and domain eventsOrders retain immutable commercial snapshots
Category and brand referencesOnly active references are acceptedCategory and Brand remain separate Catalog aggregates
FactCurrent invariantPurpose
VariantAt most 20; unique attribute combinations; final price within ±50% of parent base priceKeeps option sets bounded and commercially coherent
MediaImages at least 800 × 800; at most three videos; optional variant targetingPreserves usable product presentation
Category / BrandReferences must be activeProtects navigation, filtering and descriptive ownership

7. Publication Decision

The intended workflow records review intent before exposure. The current implementation has two approval paths that do not run the same checks.

Sequence showing dispatcher publication running the selling gate while pending-price approval currently calls Product approve directly
The dispatcher path runs the application selling gate before publication. The pending-price approval path clears the price change and calls the aggregate approval action directly, so it currently bypasses that gate.
LayerChecksCurrent role
ProductPublicationValidatorEight aggregate-local completeness checksReusable domain validation, not the complete selling gate
DefaultProductValidationServiceThe same eight plus cost price, pending price and SEO completenessDispatcher invokes all eleven before approve or direct publish
Pending-price UI approvalClears the price change, then calls aggregate approvalCurrently bypasses the eleven-check application gate and source-state guard

8. Projection and Operating Limits

Lifecycle changes leave Catalog through its transactional outbox. Search and other consumers update asynchronously and remain repairable from authoritative Catalog state.

Catalog product mutation commits with an outbox row, publishes to Kafka and updates search and downstream projections
At-least-once delivery means consumers must be idempotent. Kafka transports committed change; it does not become the Product source of truth.
Search visibilityPublished products enter rebuild; normal storefront search also hides projected out-of-stock products.
Unknown stockThe current Catalog projection fails open when availability has not yet been projected.
Scheduled publicationRuns every 60 seconds by default and skips products with a pending price change.
Search recoveryPublished products can be reindexed in pages and stale documents are purged.
SecurityCatalog staff authority and employee-scoped database RLS protect management operations.
Current approval gapThe pending-price path bypasses the dispatcher selling gate; this page states that limit explicitly.