notshop-bundle/docs/parallel-migration.md
2026-05-26 16:13:29 +00:00

120 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Parallel Migration Guide
Run your sovereign stack alongside Shopify during migration — no cutover risk, no forced downtime.
## Overview
Five phases:
1. **Deploy** — Stand up the NotShop bundle (Replit + Fly.io)
2. **Mirror** — Import your product catalog from Shopify Storefront API
3. **Route** — Send a small percentage of traffic to your sovereign stack
4. **Validate** — Confirm orders, payments, and customer accounts work correctly
5. **Cut over** — Move all traffic; cancel Shopify
Customers always hit one URL. The Fly.io routing layer handles the split transparently.
---
## Phase 1: Deploy
### 1.1 Fork and deploy to Replit
1. Fork [git.wellspr.ing/WellBuilder/notshop-bundle](https://git.wellspr.ing/WellBuilder/notshop-bundle)
2. Import into Replit (New Repl → Import from Git)
3. Add environment variables in the Secrets tab (see `.env.example`)
4. Click Run — storefront starts on your Replit domain
### 1.2 Deploy the Fly.io routing proxy
```bash
flyctl auth login
flyctl launch --copy-config --name yourstore-proxy
flyctl secrets set SHOPIFY_ORIGIN=https://yourstore.myshopify.com
flyctl secrets set SOVEREIGN_ORIGIN=https://yourrepl.replit.app
flyctl secrets set SOVEREIGN_WEIGHT=0
flyctl deploy
```
### 1.3 Point your domain to Fly
Update DNS (Bunny.net recommended) to CNAME your domain to the Fly.io app:
```
yourstore.com CNAME yourstore-proxy.fly.dev
```
At this point 100% of traffic still routes to Shopify. Your sovereign stack is deployed but idle.
---
## Phase 2: Mirror — import product catalog
```bash
npm run catalog:import
```
Pulls products, variants, and collections from the Shopify Storefront API into your PostgreSQL database.
See [storefront-api.md](storefront-api.md) for token setup.
Re-run anytime to sync changes. For real-time sync, configure the webhook bridge (`server/webhook-bridge.ts`).
---
## Phase 3: Route — split traffic
Once the catalog is imported and the storefront renders correctly:
```bash
flyctl secrets set SOVEREIGN_WEIGHT=10 # 10% to sovereign, 90% to Shopify
flyctl deploy
```
The proxy assigns a session cookie on first visit so each visitor stays on the same backend for their entire session.
Ramp gradually: 10 → 25 → 50 → 90 → 100. Each step is a 30-second Fly.io deploy.
---
## Phase 4: Validate
While traffic is split:
- **Orders** — Check `/admin` for successful orders
- **Payments** — Confirm Authorize.net transactions in your Authorize.net control panel
- **Checkout flow** — Go through checkout yourself
- **Customer accounts** — Test account creation and login
---
## Phase 5: Cut over
```bash
flyctl secrets set SOVEREIGN_WEIGHT=100
flyctl deploy
```
All traffic now goes to your sovereign stack. Then:
1. Cancel Shop Campaigns (if not already paused — do this first)
2. Export order history from Shopify Admin as CSV
3. Downgrade from Shopify Plus (requires notice period per your contract)
---
## Timeline
Most merchants complete migration in 24 weeks:
| Week | Work |
|---|---|
| 1 | Deploy, mirror catalog, validate storefront |
| 2 | Route 10% traffic, monitor orders |
| 3 | Ramp to 50%, tune any issues |
| 4 | Cut over to 100%, cancel Shopify |
---
## Support
Questions: [notshop.org/report](https://notshop.org/report) or open an issue in this repository.