How to Export Shopify Orders, Products and Customers to JSON
Export Shopify data to a JSON file on a schedule or on demand, save it to your File Store or an SFTP server, and hand clean JSON to any system that cannot call the Shopify API itself.
What This Integration Does
Shopify's admin exports CSV, not JSON, and only for some objects. When a warehouse system, a data team or a partner wants Shopify data as JSON, the usual answer is a script someone has to maintain. This Spojit workflow does it without code: it reads orders, products or customers through the Shopify Admin API, pages through every result, trims each record to the fields you choose, and writes one JSON file per run. The file lands in your Spojit File Store, and optionally on an SFTP server where another system picks it up.
Each run writes a new file named with the run date, so you keep a history and nothing is overwritten by accident. You choose between a full export (everything matching a query) and an incremental one (only records updated since the previous run), which keeps files small for daily feeds.
Prerequisites
- A Shopify connection with the read scopes for what you export:
read_orders,read_productsorread_customers. - Optional: an FTP / SFTP connection if the file should go to another server.
Step 1: Trigger
Add a Trigger node. Use Schedule with 0 2 * * * for a nightly file, or Manual for exports you run when someone asks. A manual run can take a JSON body such as { "query": "created_at:>'2026-01-01'" }, which you read as {{ input.query }} in Step 2.
Step 2: Read the Records
Add a Connector node on Shopify in Direct Mode. Pick the tool for the object:
- Orders:
list-orders - Products:
list-products - Customers:
list-customers
Set first to 250 (the maximum) and query to a Shopify search query such as updated_at:>'2026-10-13T00:00:00Z' for an incremental export or status:active for active products. Name the output page.
Step 3: Page Through Everything
Shopify returns at most 250 records per call, with a cursor for the next page. Put the call inside a Loop in While mode that repeats while the page info says there is a next page, passing the previous end cursor into after. Collect each page's records into a list as you go. Set Max iterations to a sensible ceiling (for example 200, which is 50,000 records) so a bad query can never loop forever.
Step 4: Keep Only the Fields You Need
Add a Transform node with Iterate over set to the collected records and define the output fields, for example for orders: id, name, createdAt, displayFinancialStatus, the total amount, customer email and shipping country. A trimmed file is smaller, easier for the receiving system to parse, and leaks less customer data. If the consumer wants Shopify's shape untouched, skip the Transform and use JSON Tools pick or omit to remove only the fields you must not share.
Step 5: Serialise and Save the File
Add a Connector node on JSON Tools with stringify, data set to your list and pretty on if people will read the file. Then add a File Store node with the Save a file operation:
- Name:
shopify-orders-{{ run_date.result }}.json(buildrun_datewith the Date & Time connector'sformattool, for exampleYYYY-MM-DD). - Content: the stringified JSON.
- Content type:
application/json. - If the name is taken: Keep both.
Step 6: Deliver It (Optional)
To hand the file to another system, add a Connector node on FTP / SFTP with upload-file, path /exports/shopify-orders-{{ run_date.result }}.json and content the same JSON string. For a person, use the Send Email node with a link to the File Store file, or a Resend step with the file as an attachment.
Tips
- JSON Lines for big exports: warehouses and data tools often prefer one JSON object per line. Join the records with newlines using Text Tools
joinafter stringifying each one, and name the file.jsonl. - Exactly the fields you want: the
raw-graphqltool lets you write the Shopify GraphQL query yourself, so you fetch only the fields you export and avoid trimming later. - Serve JSON on request: to let another system pull live JSON instead of a file, start the workflow with a Webhook trigger in Sync mode and return the list from a Response node.
- Incremental exports: store the time of the last successful export and use it in the
updated_atquery, so a failed night is picked up by the next run.
Common Pitfalls
- Orders older than 60 days: without the
read_all_ordersscope Shopify silently returns only the last 60 days. - Rate limits on big stores: Shopify's GraphQL API uses a cost budget. Very large exports should run overnight and request fewer fields per record.
- Personal data: customer and order exports contain names, emails and addresses. Trim fields, restrict who can open the File Store folder, and avoid emailing full exports.
- GraphQL IDs: IDs come as
gid://shopify/Order/.... If the receiving system expects numeric IDs, strip the prefix in the Transform.
Testing
Run the workflow manually with a narrow query (one day of orders, or title:'Test' for products) and open the file in your File Store. Check that the record count matches Shopify and that the fields are what the receiving system expects, then widen the query and turn the schedule on.