Skip to content

Tenant Sync

Supplier API/Feed
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Connector │────►│ magic_pim │────►│ magic_b2b_ │
│ (parse) │ │ (master DB) │ │ {tenant} │
└──────────────┘ └──────────────┘ └──────────────┘

Location: /mnt/data/magic_pim/backend/src/modules/connectors/

FilePurpose
index.tsMain connector orchestration
types.tsShared TypeScript type definitions
database.tsPostgreSQL upsert operations
sync-state.tsTrack sync status
excel-parser.tsCSV/Excel parsing
suppliers/spranz.tsSpranz stock feed handler (stock sync only)
suppliers/xdconnect.tsXD Connect feed handler
suppliers/xdconnect-categories.tsXD Connect category sync
suppliers/pfconcept.tsPF Concept feed handler
suppliers/pfconcept-imagedata.tsPF Concept image metadata sync
suppliers/midocean.tsMidocean handler
suppliers/toppoint.tsToppoint handler
suppliers/newwave.tsNewWave Textiles handler (Cutter & Buck, Clique, Craft, Jobman)
// Bulk upsert products
upsertProducts(products: ProductData[])
// Single product upsert with variant_code handling
upsertProduct(product: ProductData)
// Update stock levels
upsertStock(stockData: StockData[])
// Update pricing tiers
upsertPrices(priceData: PriceData[])
// Category management
upsertCategories(categories: CategoryData[])
// Sync statistics
getConnectorStats(): Promise<ConnectorStats>

Via Admin Panel → ADVANCED → Connectors → “Sync Now” button

Terminal window
# Or via API
curl -X POST "https://admin-development.magiceverse.online/admin/connectors/sync" \
-H "Content-Type: application/json" \
-d '{"connector_id": "spranz_stock", "force": true}'

Configured per connector:

ConnectorSchedule
spranz_stock2x daily (06:00, 18:00)
xdconnect_productsHourly
xdconnect_stockEvery 15 minutes
xdconnect_pricesDaily
xdconnect_categoriesDaily
pfconcept_productsDaily at 05:00
pfconcept_stock2x daily (02:00, 13:00)
pfconcept_imagedataDaily
midocean_productsConfigured
toppoint_productsConfigured
newwave_productsConfigured

After importing to aplt_products, data can be synced to native Medusa product tables:

POST /admin/connectors/medusa-sync

This creates standard Medusa products from APLT data, enabling native Medusa features (cart, checkout, payments).

The PIM database is accessed directly by tenant backends via shared PostgreSQL:

  • All tenants connect to host.docker.internal:5432
  • Each tenant reads from its own magic_b2b_{tenant} database
  • Product data is copied from PIM to tenant databases during connector sync
  • Failed syncs are logged with error details
  • Partial syncs continue processing remaining items
  • Force download option bypasses cached data
  • Sync state tracked in sync_state table