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_products or read_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 (build run_date with the Date & Time connector's format tool, for example YYYY-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 join after stringifying each one, and name the file .jsonl.
  • Exactly the fields you want: the raw-graphql tool 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_at query, so a failed night is picked up by the next run.

Common Pitfalls

  • Orders older than 60 days: without the read_all_orders scope 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.

Learn More

Ready to build this?

Start on the free plan: 500 AI credits a month, no card needed.

Start free

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