← back to Dwla Rebrand
PLAN.md
114 lines
# DWLA Rebrand — Pointe (PI-) + Justin David (JD-) → Los Angeles Fabrics
## Source state (2026-05-07)
| | Count |
|---|---|
| Registry rows with `PI-` mfr_sku (Pointe) | 2,870 |
| Registry rows with `JD-` mfr_sku (Justin David) | 4,730 |
| **Total target registry rows** | **7,600** |
| Registry rows already linked to a `shopify_product_id` | 1,148 |
| Shopify products with `DWPN-` SKU (registry-aligned) | 1,137 |
| Shopify products with `DWPR-` SKU (registry-orphan; the bug) | 3,024 |
| Hard-duplicate DWPR SKUs (same SKU on 2 records) | 21 |
| Hard-duplicate Shopify product records | 42 |
## Target state
| | Target |
|---|---|
| Registry vendor_name | `Los Angeles Fabrics` (was: `Phillipe Romano`) |
| Registry vendor_prefix | `DWLA` (was: `DWPN` / orphan `DWPR`) |
| Registry mfr_sku | unchanged (`PI-...` / `JD-...` are still upstream-vendor codes) |
| Shopify vendor | `Los Angeles Fabrics` |
| Shopify SKU | `DWLA-XXXXXX` (new sequence; map preserved in `dw_sku_registry`) |
| Shopify title `| Phillipe Romano` suffix | replaced with `| Los Angeles Fabrics` |
| Shopify tags containing "Phillipe Romano" | replaced with "Los Angeles Fabrics" |
| Old Shopify handles | 301-redirected from old → new where renamed |
| Hard-duplicate `-1` records | archived (NOT deleted) |
## Phased push plan (Shopify variant limit = 1k/day)
| Phase | Scope | Products | Days | Risk |
|---|---|---|---|---|
| 0 | Build dry-run + preview HTML | 0 writes | 0 | none |
| 1 | First 17 PI-PAMPAS-* + dedupe their 17 `-1` dups | 34 | 1 | low — proves pipeline |
| 2 | Remaining 4 dup pairs (necker-island / norman-island / palm-island stragglers) | 8 | 1 | low — same pipeline |
| 3 | Remaining ~960 PI-* registry rows w/ Shopify IDs | ~960 | 1 | medium — vendor-rename live products |
| 4 | All 4,720 JD-* registry rows w/ Shopify IDs | ~3,000 | 3 | medium |
| 5 | Backfill registry for ~3,024 DWPR orphan Shopify products | 0 Shopify writes (DB only) | 1 | low |
| 6 | URL handle rename + 301 redirects (optional cosmetic) | varies | 2 | high — SEO sensitive |
**Each phase emits a CSV diff for review before any Shopify mutation.**
## Out of scope (do NOT touch in this rebrand)
- The other ~10,239 Phillipe Romano Shopify products with non-PI/JD mfr_sku codes
- Patterns under "Hollywood Abaca", "Luxuria", "Natural Wallpaper" (those are different upstream brands)
- Any product not in `dw_sku_registry` AND not a Pointe/Justin-David-derived Shopify orphan
- Customer-facing email blasts about the rebrand (legal review needed; out of scope here)
## East-Coast → LA-area collection name map
These are the visible "city" pattern-names under Phillipe Romano. Under "Los Angeles Fabrics", East Coast names read wrong; mapping to LA-area equivalents that match prestige/character:
| East Coast name | Vibe | → LA-area equivalent |
|---|---|---|
| Kennebunkport | luxury Maine coast | **Malibu** |
| Bar Harbor | rugged Maine coast | **Santa Monica** |
| Cape May | Victorian Jersey shore | **Venice Beach** |
| Martha's Vineyard | island estate | **Catalina** |
| Block Island | quiet RI escape | **Avalon** |
| Nantucket | preppy MA classic | **Pacific Palisades** |
| Montauk | surfer-Hamptons | **Manhattan Beach** |
| Hilton Head | SC golf-resort | **Hermosa Beach** |
| Amelia Island | FL barrier | **Redondo Beach** |
| Kiawah | SC boho-luxe | **Ojai** |
| Hollywood | already LA | (unchanged) |
| Necker Island | Caribbean (BVI) | **Catalina Cove** |
| Norman Island | BVI sailing | **Pirates Cove** |
| Palm Island | tropical | **Palm Drive** |
| Parrot Cay | tropical | **Pelican Cove** |
| Stone Haven | new-name | **Stone Canyon** |
| Turneffe | Belize atoll | **Topanga** |
| Tobago | Trinidad isle | **Tujunga** |
| Storm Bay | abstract | (unchanged) |
| Tradewind Trace | abstract | (unchanged) |
| Sandy Point Stripe | beach | **Will Rogers Stripe** |
| Sisal Bay | natural | **Solstice Bay** |
| Nassau Gold | Bahamas | **Brentwood Gold** |
| Turf Bay | abstract | (unchanged) |
**Steve must confirm or override this map before any title/handle writes.**
## Safety guarantees
- **Zero Shopify writes** until the per-phase preview HTML is reviewed and approved.
- **Every mutation reversible**: the original DWPR/DWPN SKU + old vendor + old title are written to a `dwla_migration_audit` table BEFORE any Shopify call. Roll-back script reads that table and replays.
- **Shopify daily variant limit honored** — pushes throttled at ≤900/day with 90s gaps between bulk batches per `feedback_fm_pipeline_gotchas`.
- **Image gate**: any product without ≥1 image stays DRAFT post-rebrand (per `feedback_never_active_without_image`).
- **Sample-only preserved**: not archived (per `feedback_priced_bolt_or_archive`).
- **DNS/email NOT touched** — `designerwallcoverings.com` is on the do-not-touch list.
## Files
| Path | Purpose |
|---|---|
| `PLAN.md` | this doc |
| `data/la_name_map.json` | East Coast → LA mapping (Steve-editable) |
| `data/dwla_sequence.txt` | DWLA-XXXXXX sequence counter (next free number) |
| `scripts/build_dryrun.js` | reads registry + Shopify, generates preview |
| `preview/phase1.html` | reviewable HTML diff for phase 1 |
| `preview/phase1.csv` | machine-readable diff for phase 1 |
| `scripts/push_phase.js` | NOT WRITTEN until previews are approved |
| `db/migrations/001_dwla_audit.sql` | rollback table |
## Steve's go/no-go gate
Phase 0 outputs `preview/phase1.html` showing the 34-product mutation. Steve reviews. Two outcomes:
- **GO** — approve phase 1; I write `push_phase.js`; we run phase 1 against Shopify; verify; commit.
- **NO** — Steve flags issues in preview; I revise; new preview; loop until approved.
No Shopify writes happen without an explicit per-phase GO.