How to Sync BigCommerce Products to Shopify

Move your product catalog from BigCommerce to Shopify and keep it updated.

What This Integration Does

Migrating a catalog manually from BigCommerce to Shopify is days of CSV wrangling, and once you're done the two stores immediately drift apart. This workflow does the initial migration and then keeps Shopify in step with BigCommerce on a schedule, so every price, description, and image change made in your primary catalog flows downstream without intervention.

It runs on a schedule, pulls products that have changed since the last run, and either creates a new Shopify product or updates the existing one matched by SKU. The matching state lives in Spojit's variables so re-runs are idempotent and a re-trigger won't create duplicates.

Prerequisites

  • A BigCommerce connection with read access to products.
  • A Shopify connection with write_products scope.
  • An agreed convention on which BigCommerce field maps to Shopify's product handle (usually the URL slug or SKU).

Step 1: Schedule Trigger

Add a Trigger node of type Schedule. Hourly is a sensible default during active catalog work; daily is fine once the catalog is stable. Capture since as the previous run timestamp.

Step 2: List Updated BigCommerce Products

Add a Connector node pointing at bigcommerce with the list-products tool. Filter on date_modified:min so each run only handles changed records:

date_modified:min={{ since }}
include=variants,images
limit=50

Loop the paginator until the response page is empty.

Step 3: Loop and Check for an Existing Shopify Product

Wrap the rest in a Loop over the BigCommerce products. Inside, add a Connector node calling shopify list-products filtered by the SKU of the first variant. Use a Condition node to branch on whether a product came back.

Step 4: Transform BigCommerce to Shopify Shape

BigCommerce and Shopify model variants differently. Use a Transform node to:

  • Map BigCommerce name to Shopify title, and description to body_html.
  • Collapse BigCommerce option sets into Shopify's three-option model (Shopify caps at three option names).
  • Build a variants array where each variant has sku, price, and inventory_quantity.
  • Build an images array from BigCommerce image URLs.

Step 5: Create or Update in Shopify

On the "not found" branch, call shopify create-product with the transformed payload:

{
  "title": "{{ bc.name }}",
  "body_html": "{{ bc.description }}",
  "vendor": "{{ bc.brand }}",
  "variants": {{ variants }},
  "images": {{ images }}
}

On the "found" branch, call update-product with the existing Shopify product id and the same body. Store the resulting Shopify product id back in a sync-state record (MySQL or MongoDB) keyed by BigCommerce product id so subsequent runs short-circuit the lookup.

Step 6: Report Results

After the loop, summarise counts (created, updated, skipped, failed) and post via slack send-message to a catalog-ops channel. Wrap any per-item failure in a Condition so one bad SKU doesn't fail the whole batch.

Tips

  • Shopify's API caps three option names per product. If BigCommerce has more, fold extras into the variant title rather than dropping data.
  • Use raw-graphql on Shopify when you need to bulk-update variants efficiently - REST creates one variant per call.
  • Start with a Condition that limits the loop to 5 products until you've verified the mapping end to end.

Common Pitfalls

  • Image hot-linking - Shopify pulls images from the URL you provide once. If BigCommerce CDN URLs expire or change, the images vanish. Re-upload via base64 if you want self-hosted copies.
  • HTML in descriptions - BigCommerce descriptions may contain inline styles Shopify strips. Sanitise via the text connector before sending.
  • SKU collisions - If two BigCommerce variants share a SKU (bad data), Shopify will reject the create. Validate uniqueness in the Transform step.

Testing

Hard-limit the loop to a single BigCommerce product id known to have variants and images. Run once, inspect the resulting Shopify product (title, variants, options, images, price), then re-run to confirm the update path lands cleanly. Only then remove the limit.

Learn More

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.