How to migrate a Trendyol catalog to Shopify
Trendyol and Shopify model a product differently: Trendyol groups variants under a productMainId and keys each variant by barcode, while Shopify groups variants by URL handle and keys them by row, with Option1–Option3 carrying size and colour. A migration is therefore a mapping exercise, not a copy: you export Trendyol content and variants, map productMainId to handle, barcode to Barcode, stockCode to SKU, and variant attributes to Option columns, then validate before publishing.
Field mapping
Trendyol field names are those used by Crossell's Trendyol integration (content-level fields are shared across variants; variant-level fields repeat per barcode). Shopify column names are from Shopify's product CSV reference.
| Trendyol | Shopify | Notes |
|---|---|---|
| productMainId | URL handle | Groups every variant of one product. Shopify treats rows sharing a handle as one product. |
| title | Title | Content-level on Trendyol. In Shopify only the first row of a handle carries it. |
| barcode (variant) | Barcode | The variant key on Trendyol. Must be unique per variant on both sides. |
| stockCode (variant) | SKU | Your internal code. Shopify requires it if you use a custom fulfillment service. |
| salePrice | Price | The price actually charged. |
| listPrice | Compare-at price | Shows as the struck-through price. Leave empty if there is no discount. |
| stock.quantity | Inventory quantity | Shopify only accepts this column for single-location stores; multi-location uses a separate inventory CSV. |
| brandId | Vendor | Resolve the brand id to its name first — Shopify stores a free-text vendor. |
| categoryId | Product category | Not a 1:1 match. Shopify uses its own Standard Product Taxonomy, so every Trendyol category needs an explicit mapping. |
| attributes (variant) | Option1/2/3 name + value | Size and colour become Option columns. Shopify allows at most three options per product. |
Where these migrations break
Variants collapse into separate products
- If the handle is not identical across a product's rows, Shopify creates one product per row. Derive the handle from productMainId, never from the title.
More than three variant axes
- Shopify supports three options. A Trendyol product with four distinguishing attributes cannot be represented directly and needs one axis folded into the title or SKU.
Category mapping is silently wrong
- There is no automatic correspondence between a Trendyol categoryId and Shopify's taxonomy. An unmapped category imports, but filtering and Google Shopping feeds degrade.
Duplicate or missing barcodes
- Barcode is the variant identity on Trendyol. Duplicates merge variants that should stay separate; blanks make the reverse sync ambiguous.
Images are separate rows
- Shopify expects one row per additional image, repeating the handle, and the URLs must be publicly reachable at import time.
The migration, step by step
- 1
Export the Trendyol catalog
Pull content and variants together so the productMainId to barcode relationship survives the export.
- 2
Resolve ids to names
Convert brandId and categoryId into values Shopify accepts. This is the step that needs a decision per category, not an algorithm.
- 3
Build the variant grid
Group by productMainId, emit one row per barcode, and map variant attributes into Option1–Option3.
- 4
Validate before publishing
Check for duplicate barcodes, products above three options, unmapped categories, and unreachable image URLs.
- 5
Publish, then reconcile
Import to Shopify, then confirm variant counts per product match the source before pointing inventory sync at it.