Product Catalog

Built to Last Decades

Rempla plans schedule gifts years -- sometimes decades -- into the future. The catalog is designed from day one to tolerate vendor churn, price drift, and catalog rewrites without ever breaking a customer's original promise.

Overview
Three Tiers, One Catalog

Most e-commerce catalogs you've used separate the thing customers see from the variants they pick from the vendor-specific fulfillment. Rempla follows the same pattern -- Shopify, Amazon, BigCommerce all work this way -- and uses the separation to survive the long scheduling horizons our plans demand.

Product
"Dozen Red Roses"
Variant (many per product)
"12 stems" · "24 stems" · "Mixed"
Vendor Offer (many per variant)
FTD @ $45 · 1-800-Flowers @ $50 · Local Florist @ $38
Why three tiers? Product is the concept. Variant is the customer-facing option. Vendor Offer is where the real fulfillment lives -- pricing, SKU, lead time, stock. Splitting them means one variant can have many vendors behind it, and vendors can be swapped without touching the product.
The Three Tiers
What Each Layer Owns

Each tier has a distinct job. The boundaries matter: if we blur them, the catalog gets harder to maintain and vendor swaps become risky.

Product
The Concept

Vendor-agnostic. Carries the name, description, category, and default lead time. No price, no vendor, no SKU lives here.

Name"Dozen Red Roses"
CategoryFlowers
Default lead time3 days
OccasionsAnniversary, Valentine's Day, Just Because
Product Variant
The Customer-Facing Option

A selectable option under a product: size, color, configuration. Customers see these on the gift card. Still vendor-agnostic -- still no price.

Under product"Dozen Red Roses"
Name"12 stems red"
Size12
ColorRed
Vendor Offer
The Fulfillment Tuple

A specific variant offered by a specific vendor. This is where money, SKUs, and availability live. A single variant can have multiple offers at once.

Our SKUREM-000123
VendorFTD
Vendor SKUFTD-ROSE-DOZEN
Vendor cost$45.00
List price$65.00
StatusActive
Priority10 (higher wins)
Our SKU vs. Vendor SKU: "Our SKU" is a stable internal identifier that never changes. "Vendor SKU" is whatever the vendor calls the same item. We route orders through our SKU; the vendor SKU is just how we translate for their system.
The Ten-Year Problem
Late-Bound Vendor Resolution

A customer schedules a gift in 2026 to be delivered in 2036. By 2036, the vendor they originally quoted against may be out of business, acquired, or simply retired from our network. We can't tell the customer ten years later that their gift failed because our supplier changed.

At Order Creation
Bind to Variant Only

The order records what the customer picked (the variant) and what we promised (the price). It does not lock in a specific vendor.

At Delivery Time
Pick the Best Live Offer

When a scheduled delivery fires, the system queries the currently-active vendor offers for the variant and picks the winner by priority and availability.

Vendor Retirement

Retiring a vendor is a status change, not a delete. The vendor row stays, the offers stay (marked Disabled), the historical audit trail is preserved, and any in-flight order simply routes through the next-best active offer for its variant. No bulk order invalidation. No mass customer notification.

Substitution Policy

Each order item carries a policy for what the system is allowed to do if no offer exists for the original variant at execution time:

ExactSame variant only. Fail if unavailable.
VariantEquivalentAdmin-curated acceptable replacements.
ProductEquivalentAny variant of the same product is fine.
CancelFail cleanly. No substitution ever.
The Customer Promise
Frozen Price, Frozen Display

Vendor prices drift. Marketing photos get retaken. Product descriptions get rewritten. None of that should change what a customer sees on a plan they bought years ago.

Promised Unit Price

When an order is created, the price the customer is quoted is frozen onto the order item. It's honored at delivery execution regardless of what the current vendor offer costs. If vendor pricing rises, the business absorbs the variance. If it drops, the business keeps the margin. The customer never sees the delta.

Display Snapshots

The order item also captures a snapshot of the product's name, description, and hero image at purchase time. A ten-year-old plan summary shows what the customer originally picked -- not whatever the catalog entry has since been rewritten to say. New purchases always use the live catalog; historical orders always use their snapshot.

Keeping It Clean
What the Catalog Owns -- and Doesn't

Adjacent domains (remembrance plans, the vault, orders) all have legitimate pressure to push their concerns into the catalog. We resist that. The catalog is a descriptive "what can be bought, from whom, at what price" model -- nothing else.

Catalog Owns
  • Products & variants
  • Vendors & vendor offers
  • Categories & occasions
  • Product images
  • Substitution graph
Lives Elsewhere
  • Schedule & recurrence (plan)
  • Recipients & personalization (plan)
  • Vault boxes & storage (vault)
  • Orders, deliveries, routing (ordering)
  • Inflation-adjusted escrow (payment)
Drift Signals

Any future proposal to add PlanId, IsPersonalizable, IsScheduledOnly, RecipientId, VaultBoxSize, or similar plan/vault/order-specific fields to Product, ProductVariant, or VendorOffer should be treated as domain drift and relocated -- not merged.

Taxonomy
Categories & Occasions

Categories are the "what type of thing is this?" axis, single-valued per product. Occasions are the "when is this good to give?" axis, many-valued per product. A dozen red roses might carry one category (Flowers) and several occasions (Anniversary, Valentine's Day, Just Because).

Categories (seeded, 6)
  • Flowers
  • Experiences
  • Jewelry
  • Food & Gourmet
  • Keepsakes
  • Charitable Donations
Occasions (seeded, 9)
  • Birthday
  • Anniversary
  • Valentine's Day
  • Mother's Day
  • Father's Day
  • Christmas
  • Graduation
  • Memorial / Death Anniversary
  • Just Because
Status
Where We Are

As of April 19, 2026.

Shipped
In Flight
Next
Rempla -- Remembrance Planning
Updated April 19, 2026