How to Sync Shopify Collections to BigCommerce Categories
Build a Spojit workflow that reads your Shopify collections on a schedule and creates or updates the matching BigCommerce categories so your merchandising structure stays consistent across both stores.
What This Integration Does
If you run a Shopify storefront alongside a BigCommerce store, your category tree tends to drift. Someone adds a "Summer Sale" collection in Shopify, renames "Outerwear" to "Coats", or retires an old grouping, and the BigCommerce side quietly falls behind. This workflow makes Shopify the source of truth for merchandising structure: it pulls every Shopify collection, then for each one it either updates the matching BigCommerce category or creates it if it does not exist yet. The result is two stores whose top-level navigation and grouping stay aligned without anyone re-keying anything.
The workflow runs on a Schedule trigger, so it fires unattended on a cron expression you choose (for example, every morning). On each run it reads collections from Shopify, walks the list, and matches each collection title against existing BigCommerce categories by name. When a name already exists, it updates that category; when it does not, it creates a new one. The workflow is idempotent by design: re-running it does not create duplicates, because the match-by-name check runs before any create. It leaves the BigCommerce category tree as a mirror of Shopify collection titles and descriptions, and a re-run simply re-applies the current Shopify state.
Prerequisites
- A Shopify connection in Spojit with read access to collections. See Adding a New Connection if you have not connected Shopify yet.
- A BigCommerce connection in Spojit with permission to read and write the product catalog (categories).
- The BigCommerce category tree ID you want to write into. Most stores have a single tree whose ID is
1; confirm yours before scheduling broad writes. - A decision on how to match: this tutorial matches Shopify collection
titleto BigCommerce categoryname. Keep titles clean and unique on the Shopify side.
Step 1: Add a Schedule trigger
Start a new workflow in the Workflow Designer and add a Trigger node with Trigger Type set to Schedule. A Schedule trigger uses a 5-field Unix cron expression plus an IANA timezone. To run once each weekday morning, set the cron to 0 9 * * 1-5 and the timezone to something like Australia/Sydney. A single trigger can hold multiple schedules if you want more than one cadence. The trigger output is {{ scheduledAt }}, which you can reference downstream if you want to stamp the run time into logs or emails.
Step 2: List Shopify collections
Add a Connector node in Direct mode, choose the Shopify connector, and select the list-collections tool. This returns your collections so the workflow can iterate over them. Set first to a page size such as 50 (the maximum is 250), and optionally pass a query using Shopify search syntax to limit the set (for example, only published collections). Bind the result to a variable like collections. Each collection in the result carries fields including its title and description, which you will map onto BigCommerce in the steps that follow.
Step 3: Loop over each collection
Add a Loop node in ForEach mode and point it at the list of collections from the previous step, for example {{ collections.collections }} (adjust the path to match the array field returned by list-collections in your run). Inside the loop body, each iteration exposes the current item, which you can reference as {{ item }}. Everything in Steps 4 through 6 lives inside this loop so the logic runs once per Shopify collection.
Step 4: Check whether the category already exists in BigCommerce
Inside the loop, add a Connector node in Direct mode using the BigCommerce connector and the list-categories tool. Pass the current collection title into the name filter, for example {{ item.title }}, and bind the result to existing. BigCommerce returns categories matching that name. Then add a Condition node that branches on whether a match came back, for example checking that the returned list length is greater than zero. The true branch goes to the update step; the false branch goes to the create step.
Step 5: Update the matching BigCommerce category
On the true branch, add a Connector node in Direct mode with the BigCommerce connector and the raw-api-request tool. BigCommerce category writes use the catalog endpoint, so set method to PUT and path to the matched category, for example /catalog/categories/{{ existing.data[0].category_id }} (use the category ID returned in Step 4). Provide a body that carries the fields you want to keep in sync:
{
"name": "{{ item.title }}",
"description": "{{ item.descriptionHtml }}",
"is_visible": true
}
This keeps the BigCommerce category name and description aligned with the Shopify collection. Map only the fields you actually want Shopify to own, and leave the rest untouched so manual BigCommerce edits to other fields survive.
Step 6: Create the category when it does not exist
On the false branch, add a Connector node in Direct mode with the BigCommerce connector and the raw-api-request tool again, this time set method to POST and path to /catalog/categories. Supply a body that includes the tree the category belongs to and its parent (use 0 for a top-level category):
{
"tree_id": 1,
"parent_id": 0,
"name": "{{ item.title }}",
"description": "{{ item.descriptionHtml }}",
"is_visible": true
}
Because the create step only runs when Step 4 found no match, re-running the whole workflow does not produce duplicate categories: existing names route to the update branch instead. After the loop finishes, the BigCommerce category tree mirrors your current Shopify collection titles.
Step 7: Notify yourself when the sync runs (optional)
Add a Send Email node after the loop to confirm each run. The Send Email node uses Spojit's built-in mail service, so it needs no connection. Set Recipients to your address, a Subject such as Shopify to BigCommerce category sync ran, and a short Body that references {{ scheduledAt }} and a count of collections processed. If you would rather route alerts into a channel, swap this for a Connector node using the Slack connector and the send-message tool instead.
Tips
- Use Miraxa, the intelligent layer across your automation, to scaffold the skeleton fast: try "Build a workflow with a Schedule trigger that lists Shopify collections, loops over them, and for each one checks BigCommerce categories by name, then updates or creates the category." Then fine-tune fields in the properties panel.
- Keep the Shopify page size sensible.
list-collectionsacceptsfirstup to250; if you have more collections than that, page through using theaftercursor returned in the result. - Mirror only the fields you want Shopify to govern (name and description). Leaving BigCommerce-only fields out of the body prevents the sync from clobbering merchandising work done directly in BigCommerce.
- If you want a richer match than plain title equality, add a Transform node before the condition to normalize titles (trim and lowercase both sides) so casing or spacing differences do not cause false "create" actions.
Common Pitfalls
- Wrong tree ID. BigCommerce categories belong to a tree. If
tree_idin your create body does not match your store's real tree, categories land in an unexpected place. Confirm the ID (often1) before scheduling. - Duplicate names in Shopify. Matching by title assumes titles are unique. Two Shopify collections with the same title both map to one BigCommerce category and fight over its contents. Keep collection titles distinct.
- Connection scopes. The create and update steps write to the BigCommerce catalog. If the BigCommerce connection is read-only, the writes fail. Verify catalog write permission, and see Troubleshooting Connection Issues if calls return authorization errors.
- Timezone surprises. The Schedule trigger fires against the IANA timezone you set, not the viewer's local time. A cron of
0 9 * * 1-5with the wrong timezone runs at the wrong hour. Double-check the timezone field.
Testing
Before scheduling broad writes, validate on a small scope. In Step 2, add a query to list-collections so only one or two test collections come back, or temporarily cap the loop. Run the workflow with the Run button and watch the execution log to confirm the condition routes correctly: a brand-new title should hit the create branch and a known title should hit the update branch. Check BigCommerce to confirm the category appears with the right name, description, and tree. Once a single collection round-trips cleanly, remove the test filter and enable the schedule.