# Solution Design: Products — bulk CSV import/export

| | |
| --- | --- |
| **Anchor** | [wiggleverse/wiggleverse-ecomm#13](https://git.wiggleverse.org/wiggleverse/wiggleverse-ecomm/issues/13) (`type/feature`, `priority/P1`) — parent epic [#12](https://git.wiggleverse.org/wiggleverse/wiggleverse-ecomm/issues/12) |
| **Author(s)** | Claude (session ecomm-0030), for Ben Stull |
| **Reviewers / approvers** | Ben Stull |
| **Status** | `draft` |
| **Version** | v0.1.0 |
| **Source artifacts** | BDD corpus: [prototype rfcs 11-05-\* (products import/export)](https://git.wiggleverse.org/wiggleverse/wiggleverse-ecomm-prototype-content/src/branch/main/rfcs) · [research/shopify/products](https://git.wiggleverse.org/wiggleverse/wiggleverse-ecomm-prototype-content/src/branch/main/research/shopify/products/products.md) · Prototype: [wiggleverse-ecomm-prototype](https://git.wiggleverse.org/wiggleverse/wiggleverse-ecomm-prototype) · Reference: Shopify product CSV · Builds on: [SD-0001](./SD-0001-mvp-sign-up-and-single-storefront.md) · Supersedes: — |

**Change log**

| Date | Version | Change | By |
| --- | --- | --- | --- |
| 2026-06-11 | v0.1.0 | Initial draft — §1 Business Context (session ecomm-0030) | Claude + Ben |

---

## 1. Business Context

*The business lens — solution-agnostic throughout. No mechanism is proposed until §2.*

### 1.1 Executive Summary

A merchant's catalog already exists before they ever meet this platform — in
spreadsheets, in their current platform's export, in the working files they
price and re-price every season. The value at stake is letting that catalog
*become* their storefront without re-entering it, letting catalog-wide changes
(a season's prices, a supplier's new costs) land as one gesture instead of
hundreds, and guaranteeing the catalog can leave whole at any time — so
adopting the platform never means retyping a business in, and never means
locking a business up. The beneficiaries are merchants — most acutely those
migrating from another platform — and the platform itself: every downstream
capability of an ecomm (browsing, orders, checkout) presupposes a real catalog
existing, and today none can.

### 1.2 Background

ecomm is Wiggleverse's multi-tenant Shopify alternative. Its first Solution
Design ([SD-0001](./SD-0001-mvp-sign-up-and-single-storefront.md)) shipped
sign-up, identity, and single-storefront creation: a merchant can exist and
their storefront can exist — and that storefront is, by design, an honestly
empty shell ("There's nothing to manage yet").

The Products MVP epic ([#12](https://git.wiggleverse.org/wiggleverse/wiggleverse-ecomm/issues/12))
is the next move: give the storefront a real product catalog. The epic makes a
deliberate boundary decision: the MVP ships **no per-item editing** — bulk
ingestion and extraction is the *only* way product data moves. Its sibling
Features display the catalog
([#14](https://git.wiggleverse.org/wiggleverse/wiggleverse-ecomm/issues/14),
list + read-only detail) and extend it to bundled offerings
([#15](https://git.wiggleverse.org/wiggleverse/wiggleverse-ecomm/issues/15),
kits); **this** Feature is the mechanism they all feed from.

The backdrop that makes bulk-first the right boundary: real merchant catalogs
are not built one item at a time inside an admin tool. Merchants switching
platforms hold their entire catalog as an export of their current system —
hundreds of products, each with variations, images, and prices. Merchants who
stay maintain their catalogs batch-wise: a seasonal price list, a supplier's
updated cost sheet, a spreadsheet kept as the working source of truth. The
catalog's natural lifecycle is bulk in, bulk update, bulk out.

### 1.3 Business Actors / Roles

Real-world roles — they exist whether or not this platform does.

| Role | Responsible for (in the business) |
| --- | --- |
| **Merchant** | Owns a storefront's catalog: what is sold, at what price, shown how. Keeps it current as seasons, suppliers, and stock change. |
| **Migrating merchant** | A merchant switching platforms. Their catalog already lives, complete, in their current system and its export files; they decide whether switching is worth the cost. |
| **Platform builder** | Builds and validates the capabilities a catalog feeds (browsing, orders, demos). Needs realistic catalogs to exist before those capabilities can be exercised. |

### 1.4 Problem Statement

A storefront can exist but cannot hold anything sellable: there is no way to
get product data into the platform at all, and the MVP deliberately offers no
per-item editing to fall back on. For the merchant whose catalog already
exists elsewhere — the common case — hand re-entry of hundreds of products,
each with variations, imagery, and prices, is a switching cost that simply
ends the conversation. The gap recurs after adoption: catalog maintenance is
batch-shaped (whole-catalog price changes, supplier updates), and one-at-a-time
upkeep mismatches how merchants actually work their data. And data that goes
in must come out: a catalog that cannot be extracted whole makes the platform
a trap, which careful merchants correctly treat as a reason not to enter.

### 1.5 Pain Points

| # | Pain | Who feels it | Cost / frequency today |
| --- | --- | --- | --- |
| PP-1 | A created storefront is a dead end — nothing to sell, nothing to manage, nothing to show | Merchant | Total: blocks any real use of the platform; felt by every merchant immediately after sign-up |
| PP-2 | An existing catalog would have to be re-keyed item by item to move over | Migrating merchant | Hundreds of products × dozens of fields each — a prohibitive switching cost; prospective merchants don't switch |
| PP-3 | Catalog-wide changes (season prices, supplier costs) have no whole-catalog gesture | Merchant | Recurring — every season, supplier change, or repricing event; effort scales with catalog size |
| PP-4 | No realistic catalog can be stood up to build, demo, or validate against | Platform builder | Continuous — every product-dependent capability (#14, #15, future orders) is blocked or faked |
| PP-5 | Whatever goes in cannot be gotten back out — the catalog would be trapped | Merchant | Felt at the adoption decision (a reason to say no) and at every backup/audit/leave moment after |

### 1.6 Targeted Business Outcomes

| # | Outcome | Success metric | Baseline → Target | Guardrail (must not regress) | How / when measured |
| --- | --- | --- | --- | --- | --- |
| BO-1 | Merchants with existing catalogs adopt — populating a storefront is hours, not weeks | # storefronts holding a real catalog; effort to first full catalog | 0 storefronts can hold a catalog → a several-hundred-product catalog lands in under an hour of merchant effort | Sign-up → storefront flow (SD-0001) stays intact | Platform records (operationalized §8.1); reviewed monthly |
| BO-2 | Catalog upkeep happens *in* the platform — merchants refresh in bulk rather than letting data go stale or leaving | # storefronts performing repeat bulk updates | No upkeep possible → catalog-holding storefronts update in bulk as their prices/data change | Existing catalog data never corrupted by an update | Platform records; reviewed monthly |
| BO-3 | "My data would be trapped" is a non-objection — the catalog is extractable whole, always | Full-catalog extraction available and exercised | No extraction exists → every storefront's complete catalog can be taken out on demand, at any time | Extraction completeness: nothing the merchant supplied is unrecoverable | Platform records; reviewed quarterly |
| BO-4 | Product-dependent work is unblocked — sibling and downstream capabilities build against real catalogs | #14 / #15 / future order work proceeding against realistic data | Nothing to build against → realistic catalogs standable in minutes | — | Delivery record of #14/#15; per Feature |

### 1.7 Scope (business)

- **In scope:** populating a storefront's catalog in bulk from records the
  merchant already holds; updating the catalog in bulk; extracting the
  complete catalog at any time. "Catalog" here means products in full
  commercial reality: variations (size/color and the like), imagery,
  organization (vendor, type, tags, category), pricing/cost, stock levels,
  and publication state.
- **Out of scope:** per-item create/edit (a later epic — the MVP's deliberate
  boundary); removing products in bulk (nothing is deleted by this mechanism —
  see §2); automated or scheduled synchronization with other platforms;
  movement of non-catalog data (customers, orders — other epics); the meaning
  and behavior of bundled offerings (kits — Feature #15, which rides this
  mechanism but defines its own semantics).
- **Non-goals:** real-time integration with other commerce systems (the
  supplied file is the boundary, deliberately); making the MVP a catalog
  *editing* tool of any kind.

### 1.8 Assumptions · Constraints · Dependencies

- **Assumptions:** merchants hold, or can readily produce, their catalog as a
  structured file (a spreadsheet, their current platform's export). *Risk if
  wrong:* a merchant with no digital catalog at all has no entry path in this
  MVP. Catalogs at MVP scale run to a few thousand items. *Risk if wrong:*
  larger catalogs need heavier machinery (a named seam, §2).
- **Constraints:** bulk-only is Epic #12's deliberate MVP boundary — this
  design must not quietly grow per-item editing. One storefront per account
  (SD-0001 INV-4) — a merchant's catalog context is unambiguous.
- **Dependencies:** SD-0001's shipped surfaces (identity, storefront, admin
  shell) — live as of v0.4.0. Sibling #14 displays what this ingests; sibling
  #15 extends what the records can express — both sequence after this
  mechanism exists.

### 1.9 Business Use Cases

**BUC-1 — As a migrating merchant, I can bring my existing catalog into my storefront in one bulk gesture, so that switching platforms doesn't mean re-keying my business.**

```gherkin
Scenario: BUC-1 — An existing catalog comes over whole
  Given a merchant whose catalog of several hundred products lives in an
    export from their current platform
  When they supply that catalog to their storefront in one gesture
  Then the storefront holds the full catalog — every product with its
    variations, imagery, organization, and prices
  And nothing had to be re-entered by hand
```

- **BUC-1 acceptance criteria:** the catalog the storefront holds matches the
  records the merchant supplied, completely; the merchant's effort is one
  supply-and-review gesture, not per-product work.

**BUC-1a — unhappy path: unusable records are reported, not silently dropped.**

```gherkin
Scenario: BUC-1a — Unusable records come back with actionable feedback
  Given a merchant supplies catalog records of which some are incomplete,
    contradictory, or unreadable
  When the storefront cannot accept some of the records
  Then the merchant is told exactly which records failed and why, in terms
    they can act on
  And they can correct and re-supply the problem records
  And nothing is silently dropped, guessed at, or invented
```

- **BUC-1a acceptance criteria:** every rejected record is identified with an
  actionable reason; accepted vs. rejected is fully accounted for — the
  merchant is never left wondering what made it in.

**BUC-2 — As a merchant, I can see exactly what a bulk change will do to my catalog before it happens, so that I never damage my own data by accident.**

```gherkin
Scenario: BUC-2 — A bulk change is reviewed before it takes effect
  Given a merchant about to apply a bulk change to a catalog their business
    depends on
  When they supply the new records
  Then they see what will be added, what will change (and to what), and what
    is in error — before anything takes effect
  And the change happens only when they say so
```

- **BUC-2 acceptance criteria:** the preview is complete and faithful (what it
  shows is exactly what applying does); declining costs nothing; nothing
  changes without the merchant's explicit go-ahead. *(OHM: consent & agency —
  the merchant authorizes the change knowing what it is.)*

**BUC-3 — As a merchant, I can update my whole catalog at once, so that batch-shaped changes (seasonal prices, supplier costs) cost one gesture instead of hundreds.**

```gherkin
Scenario: BUC-3 — A catalog-wide change lands as one gesture
  Given a storefront holding a catalog, and a season's repricing touching
    most of it
  When the merchant supplies the updated records
  Then the affected products are updated to the new values
  And the unaffected products are untouched
  And no duplicates are created
```

- **BUC-3 acceptance criteria:** updates land on the products they target;
  re-supplying unchanged records changes nothing (supplying the same catalog
  twice never doubles it); the merchant's effort does not scale with catalog
  size.

**BUC-4 — As a merchant, I can take my complete catalog out at any time, so that my business data is never trapped in the platform.**

```gherkin
Scenario: BUC-4 — The catalog leaves whole, on demand
  Given a storefront holding a catalog the merchant built up over time
  When the merchant asks for their catalog
  Then they receive the complete catalog — every product, variation, image,
    and price — in a form they can use elsewhere
  And what they receive could rebuild the same catalog faithfully
```

- **BUC-4 acceptance criteria:** extraction is always available, complete
  (nothing the merchant supplied is unrecoverable), and round-trips — what
  comes out can go back in and reproduce the same catalog. *(OHM: agency —
  leaving is always possible; the platform earns retention, never extorts
  it.)*

---

## 2. Solution Proposal

*(not yet authored — next in the section-at-a-time loop)*

## 3. Product Personas

*(not yet authored)*

## 4. Product Use Cases

*(not yet authored)*

## 5. UX Layout

*(not yet authored)*

## 6. Technical Design

*(not yet authored)*

## 7. Delivery Plan

*(not yet authored)*

## 8. Success Metrics & Measurement

*(not yet authored)*

## 9. Telemetry, Observability & Monitoring

*(not yet authored)*

## 10. Operations

*(not yet authored)*

## 11. Documentation plan

*(not yet authored)*

## 12. Traceability matrix

*(not yet authored)*

## 13. Open Questions & Decisions log

*(not yet authored)*

## 14. Glossary & References

*(not yet authored)*
