# Synchronize an external catalog Synchronize catalog data from a product-information, ERP, or other source system without creating duplicates on retries. A reliable sync makes ownership and identity explicit before writing records. ## 1. Define ownership List the fields your source owns and the fields merchants maintain in Thor. For example, an ERP may own SKU and stock while editors own product descriptions and collections. Do not overwrite merchant-owned values when importing an unrelated source change. Decide how absence in the source is handled. It may mean a paused item, incomplete export, or intentional removal. Do not treat every missing row as authorization to delete a Thor product. ## 2. Keep a durable mapping Store `(source system, source entity ID, Thor project)` to Thor resource ID mappings. Use a stable source ID, not a mutable product title. Use namespaced metadata where appropriate, but do not assume every owner or create input supports the same metadata fields. Keep an import ledger with the source revision, intended operation, result, and safe error details. On replay, use the mapping to update or inspect the existing resource before deciding to create it. ## 3. Write in dependency order 1. Store, channel, and locale configuration. 2. Attribute definitions and values, categories, and collections. 3. Products and variants. 4. Prices, inventory, and media associations. 5. Translations and deliberate publication. Use [Create and publish a product](/guides/catalog/create-product) for the minimal sequence. Keep products unpublished while required commercial data is incomplete. A successful product create does not mean the record is ready for buyers. ## 4. Make retries deterministic Use supported bulk operations within their documented limits. Record each batch's source identities and outcome before advancing your checkpoint. For a transactional batch failure, correct and replay the batch according to the operation contract. Do not guess which rows succeeded from an unordered result list. If a request times out, query the intended destination records before retrying creation. If two workers can process the same source record, coordinate ownership in your integration so they do not both create it. ## 5. Reconcile and verify Compare identities and important values, not only total counts. Sample price and availability through Storefront using the buyer's actual market context. Use webhooks to improve freshness, with periodic reconciliation to catch missed or out-of-order work. See [Bulk operations and jobs](/guides/integrations/bulk-and-jobs) for batch handling and [Webhooks](/guides/integrations/webhooks) for event processing.