- Add Apollo Client for Saleor GraphQL API - Create GraphQL fragments (Product, Variant, Checkout) - Create GraphQL queries (Products, Checkout) - Create GraphQL mutations (Checkout operations) - Add TypeScript types for Saleor entities - Add product helper functions - Install @apollo/client and graphql dependencies Part of WordPress/WooCommerce → Saleor migration
7.3 KiB
7.3 KiB
WooCommerce to Saleor Migration Guide
Migration Summary
| Component | Status | Notes |
|---|---|---|
| Products | ✅ Complete | 4 products with variants, SKUs, pricing (RSD) |
| Assets | ✅ Complete | 204 files migrated to organized folders |
| Inventory | ✅ Complete | track_inventory=false, stock records added |
| Translations | ✅ Complete | English translations added |
| Users | ⏳ Ready | 4,886 total (1,172 with orders + 2,714 prospects) |
| Orders | ⏳ Ready | 1,786 COD orders |
1. Product Migration (DONE)
Products migrated with:
- SKUs mapped directly
- Prices in RSD (Serbian Dinar)
- Published status
- Channel listings configured
- Inventory settings:
track_inventory=false
Product SKU Mapping
| WooCommerce SKU | Saleor SKU | Product |
|---|---|---|
| morning-glow | MORNING-GLOW-50ML | Morning Glow |
| hair-elixir | HAIR-ELIXIR-30ML | Hair Elixir |
| anti-age-serum | ANTI-AGE-SERUM-30ML | Anti-age Serum |
| luksuzni-set | LUK-SU-ZNI-SET | Luksuzni Set |
2. Asset Migration (DONE)
All 204 assets organized in MinIO saleor bucket:
saleor/
├── brand/ (36 files) - Logos, partner badges
├── marketing/ (133 files) - Before/after, testimonials
├── content/ (26 files) - Blog images
└── products/ (9 files) - Product photos
CDN Base URL: https://minio-api.nodecrew.me/saleor/
3. Customer & Order Migration Strategy
Customer Analysis
| Category | Count | Description |
|---|---|---|
| Total WordPress Users | 4,886 | All registered accounts |
| With Orders | 1,172 | Actually purchased something |
| Without Orders | 2,714 | Abandoned carts, newsletter signups |
| Guest Orders | 144 | No account, email only |
| TOTAL REAL CUSTOMERS | 1,274 | Unique emails from orders |
Why Migrate All 4,886 Users?
The 2,714 users without orders are valuable for:
- Abandoned cart recovery - They started but didn't finish
- Newsletter subscribers - Already interested in brand
- Reactivation campaigns - Win back potential customers
- Lookalike audiences - For Meta/Google ads
Customer Segmentation
During migration, users are automatically segmented:
| Segment | Criteria | Count (Est.) | Strategy |
|---|---|---|---|
| VIP_CUSTOMER | 3+ completed orders | ~200 | Loyalty program, early access |
| ACTIVE_CUSTOMER | 1-2 completed orders | ~972 | Cross-sell, subscription |
| CART_ABANDONER | Pending/processing orders | ~1,086 | Recovery sequence |
| PROSPECT | No orders | ~2,628 | Welcome series, education |
4. Migration Scripts
Available Scripts
| Script | Purpose | Use When |
|---|---|---|
migrate_all_users_and_orders.py |
Complete migration (recommended) | You want all users + segmentation |
migrate_cod_orders.py |
Orders only (no user creation) | Quick order migration only |
migrate_guest_orders.py |
Alternative guest checkout | Legacy option |
Recommended: Complete Migration
# Set environment variables
export WP_DB_HOST=doorwayftw
export WP_DB_USER=DUjqYuqsYvaGUFV4
export WP_DB_PASSWORD=voP0UzecALE0WRNJQcTCf0STMcxIiX99
export SALEOR_DB_HOST=doorwayftw
export SALEOR_DB_USER=saleor
export SALEOR_DB_PASSWORD=<get-from-k8s-secret>
# Preview (dry run)
python scripts/migrate_all_users_and_orders.py --users --orders --dry-run
# Migrate specific segment
python scripts/migrate_all_users_and_orders.py --users --segment VIP_CUSTOMER
# Full migration
python scripts/migrate_all_users_and_orders.py --users --orders
Migration by Segments (Phased Approach)
Phase 1: VIP & Active Customers (Lowest risk)
python scripts/migrate_all_users_and_orders.py \
--users --segment VIP_CUSTOMER --orders --limit-orders 100
Phase 2: Cart Abandoners (Medium value)
python scripts/migrate_all_users_and_orders.py \
--users --segment CART_ABANDONER --orders
Phase 3: Prospects (Reactivation focus)
python scripts/migrate_all_users_and_orders.py \
--users --segment PROSPECT
5. Post-Migration: Email Reactivation Campaigns
See EMAIL_REACTIVATION_CAMPAIGNS.md for complete strategy.
Quick Summary
| Campaign | Target | Goal |
|---|---|---|
| Cart Recovery | 1,086 abandoners | 10-15% conversion |
| Welcome Series | 2,628 prospects | 5-8% first order |
| Win-Back | Inactive customers | 3-5% reactivation |
| VIP Program | 200 top customers | Loyalty + referrals |
Campaign Templates Included
- Cart recovery (3 emails)
- Welcome series (4 emails)
- Win-back sequence (2 emails)
- VIP perks announcement
Technical Setup
Segmentation data stored in user metadata:
{
"segment": "CART_ABANDONER",
"wp_user_id": 12345,
"order_count": 1,
"completed_orders": 0,
"total_spent": 0,
"registration_date": "2022-11-20T13:42:19"
}
Export for email platform:
-- Get all PROSPECTS for welcome campaign
SELECT email, first_name, metadata->>'registration_date'
FROM account_user
WHERE metadata->>'segment' = 'PROSPECT';
6. COD Payment Handling
Since Manoon uses Cash on Delivery:
Status Mapping
| WC Status | Saleor Status | Payment |
|---|---|---|
wc-pending |
UNCONFIRMED |
Unpaid |
wc-processing |
UNFULFILLED |
Unpaid |
wc-completed |
FULFILLED |
✅ Paid (COD collected) |
wc-cancelled |
CANCELED |
Unpaid |
Payment Records
For completed orders, a dummy payment record is created:
- Gateway:
mirumee.payments.dummy - Status:
FULLY_CHARGED - Amount: Order total
This allows reporting and analytics to work correctly.
7. Data Transformations
| Field | WooCommerce | Saleor |
|---|---|---|
| Prices | Decimal (115.00) | Integer cents (11500) |
| Tax Rate | Calculated | Fixed 15% (Serbia VAT) |
| Status | wc-* strings | Saleor workflow states |
| Origin | Various | BULK_CREATE |
| Passwords | WP hashed | ! (unusable, reset required) |
8. Verification Checklist
After migration:
- User count matches: 4,886
- Order count matches: 1,786
- Segments correctly assigned
- LTV calculated for each customer
- Order totals are correct (cents)
- Completed orders have payment records
- Addresses formatted correctly
- SKUs link to correct products
9. Rollback Plan
If needed:
-- Delete imported data
DELETE FROM order_order WHERE metadata->>'origin' = 'BULK_CREATE';
DELETE FROM account_user WHERE id IN (
SELECT saleor_user_id FROM wc_complete_user_mapping
);
-- Drop mapping tables
DROP TABLE wc_complete_user_mapping;
DROP TABLE wc_order_mapping;
10. Next Steps
- ✅ Run migration preview:
--dry-run - ✅ Verify counts match expectations
- ✅ Run Phase 1 (VIP customers)
- ✅ Set up email platform (Mautic/MailerLite/Mailchimp)
- ✅ Import segments into email platform
- ✅ Launch cart recovery campaign
- ✅ Launch welcome series for prospects
- ✅ Monitor conversion rates
- ✅ Optimize campaigns based on data
Support
For issues:
- Check Saleor logs:
kubectl logs -n saleor deployment/saleor-api - Run with
--dry-runfirst - Check mapping tables for progress
- Review
EMAIL_REACTIVATION_CAMPAIGNS.mdfor marketing setup