# Shopify GraphQL bulk queries and mutations

**URL:** https://connective.celigo.com/t/shopify-graphql-bulk-queries-and-mutations/5362
**Category:** Integrator.io
**Tags:** shopify
**Created:** [August 26, 2025, 7:08pm UTC](https://connective.celigo.com/t/shopify-graphql-bulk-queries-and-mutations/5362 "2025-08-26T19:08:53Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![Calvin\_Lieu](https://avatars.discourse-cdn.com/v4/letter/c/aca169/32.png) [@Calvin\_Lieu](https://connective.celigo.com/u/Calvin_Lieu)
#### Post date: [August 26, 2025, 7:08pm UTC](https://connective.celigo.com/t/shopify-graphql-bulk-queries-and-mutations/5362/1 "2025-08-26T19:08:53Z")

</div>

# Best Practices for **Bulk** GraphQL Operations in [Integrator.io](http://Integrator.io)

I'm looking for guidance on implementing **bulk** GraphQL queries and mutations efficiently in [integrator.io](http://integrator.io), specifically regarding endpoint usage and workflow optimization.

## Main Questions

**1. Bulk GraphQL Processing Best Practices**  
What are the recommended approaches for handling **bulk** GraphQL queries and mutations in [integrator.io](http://integrator.io)?

**2. Universal Shopify Connection Capabilities**  
Does the universal Shopify connection handle the complete **bulk** operation workflow automatically? Specifically:

- Submitting **bulk** queries/mutations
- Polling for completion status
- Retrieving final results

**3. Endpoint Usage Concerns**  
I'm concerned about endpoint capacity given our current constraints. Here's my understanding, if we are required to use async helper as the standard setup:

### Current Workflow Requirements:

- **Bulk Query Results** : Results are returned as JSONL files via `https://storage.googleapis.com` URLs
- **Bulk Mutations** : Require uploading JSONL input files to AWS S3 via HTTP

### Endpoint Impact:

If the universal Shopify connection doesn't abstract these operations, I believe we'd need:

1. Primary Shopify connection endpoint
2. Universal HTTP connector for Google Cloud Storage (result retrieval)
3. Universal HTTP connector for AWS S3 (input file uploads for `bulkOperationRunMutation`)

**This would consume 3 endpoints total** , and we're already at maximum capacity.

## Specific Technical Questions:

- Are there alternative approaches that would reduce endpoint usage?
- **If abstraction isn't available** : Can we request additional endpoints at no additional cost to accommodate the **bulk** GraphQL workflow requirements?

Any insights or examples would be greatly appreciated!

---

<div class="post-metadata">

### Author: ![tylerlamparter](https://sea1.discourse-cdn.com/flex001/user_avatar/connective.celigo.com/tylerlamparter/32/9204_2.png) [@tylerlamparter](https://connective.celigo.com/u/tylerlamparter)
#### Post date: [August 29, 2025, 2:00am UTC](https://connective.celigo.com/t/shopify-graphql-bulk-queries-and-mutations/5362/2 "2025-08-29T02:00:08Z")

</div>

You can set this up with only 1 endpoint. You still create a Google APIs connection with no authentication, but since it is only used inside the async helper it does not count as an additional endpoint.

#### Prerequisites

- Shopify GraphQL connection
- Google APIs connection with no authentication (used by the async helper to fetch the JSONL results)

#### Step 1. Start the bulk job

- Create an export with an async helper.
- First request starts the bulk job.

```graphql
mutation {
  bulkOperationRunQuery(
   query: """
    {
      products {
        edges {
          node {
            id
            title
          }
        }
      }
    }
    """
  ) {
    bulkOperation { id status }
    userErrors { field message }
  }
}

```

 ![The image shows a Celigo interface for exporting Shopify graphs in bulk with a summary of the process status. (Captioned by AI)](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/8/8d2df5bbe585addc4db0870c7d7e6d3548d0b5e7.png)  
 ![The image shows a user interface for editing a GraphQL export in a Shopify app, featuring sections for naming the export, selecting a data source, configuring the GraphQL query, and previewing the data. (Captioned by AI)](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/2/2693243691cc183f3707e44dafd069cc948f1da7.png)  
 ![The image shows a software interface for configuring data export settings, including API export options, Shopify hooks, and custom settings. (Captioned by AI)](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/e/ec21a006409cc7b6fe754017222dc37084837a6d.png)  
 ![The image shows a software interface for configuring an export API and editing async helper settings with multiple input fields and options. (Captioned by AI)](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/4/493a5497ea1182f4be6397b3ac6354712c02b5ee.png)  
 ![A software interface displaying 'Edit export' and 'Edit async helper' settings for configuring and managing data export options. (Captioned by AI)](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/3/3321b50e1ef4ec19313d79fed1ad8b97c4ee8c8d.png)

#### Step 2. Poll for completion

- The async helper polls until the job completes, then reads status and URLs.

```graphql
{
  node(id: "{{data.id}}") {
    ... on BulkOperation {
      id
      status
      errorCode
      objectCount
      url
      partialDataUrl
      createdAt
    }
  }
}

```

 ![The image shows a GraphQL API export configuration interface on a computer screen, displaying fields for setting export name, type, options, and previewing data. (Captioned by AI)](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/e/e3ee9a9f24294f41d913995d0e31fc39fc955232.png)  
 ![The image shows a user interface for configuring export settings, including API response patterns and preview data options. (Captioned by AI)](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/7/72287a45d8b1213ac217262a1c230cafd75d36c3.png)

#### Step 3. Fetch the results with the Google APIs connection

- Use the returned `url`.
- If you need to trim the signed URL before use, here is the helper you showed:

```handlebars
{{{substring data.statusRes.url 30}}}

```

 ![The image shows a software interface for editing an export with fields for API connection, HTTP request settings, and a preview data pane. (Captioned by AI)](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/c/c0067f5e9a3402bc0f2f4f23e9ab464a19166a51.png)  
 ![The image shows a software interface for configuring an export setup, with options for file type, custom delimiter, and record preview. (Captioned by AI)](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/c/cd2e7e09b96be479080d11b0fd6b1143c9c1dfc2.png)  
 ![The image shows a software interface for configuring an export process, including settings for API connection, HTTP method, URL, and headers. (Captioned by AI)](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/b/b74cf8f13d4fc18e143056729346c41c6c86fa05.png)

#### Step 4. Parse the JSONL into records

- Each line is one JSON object. Convert each line to an object before saving.

```javascript
function preSavePage (options) {
  let output = [];
  for (let d of options.data) {
    output.push(JSON.parse(d.Column0));
  }
  return {
    data: output,
    errors: options.errors,
    abort: false,
    newErrorsAndRetryData: []
  }
}

```

**Reference on parsing JSONL in Celigo**

> [@Parsing JSONL Files in Celigo](https://connective.celigo.com/t/parsing-jsonl-files-in-celigo/2882):
>
> Ever need to work with a JSONL file but don't see JSONL listed as a file type within Celigo file provider exports? No worries—here’s a simple workaround to parse JSONL files and make them usable in your flows: Steps to Parse JSONL Files: Import JSONL as a CSV: Treat the JSONL file as a CSV file by selecting the CSV (or any delimited text file) option in the file provider setup. Use a custom column delimiter (e.g., celigo\_dummy\_delimiter) that would never exist in the file itself. This ensures …

* * *

### Flow ZIP

[68b0dfaf09707f2d155abf41.zip](https://connective.celigo.com/uploads/short-url/cnoOFAuCp09I4aJnXJg6pAozZX1.zip) (6.6 KB)

### Video reference

How to attach the `preSavePage` script to the result export of the async helper:

[![](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/e/ea43a298ccac20abd5716508f5cc94079156c61d.jpeg "How to configure transforms, filters, & preSavePage scripts in Celigo for exports with async helpers") ](https://www.youtube.com/watch?v=BVgIZrAEUMw)

---

<div class="post-metadata">

### Author: ![Calvin\_Lieu](https://avatars.discourse-cdn.com/v4/letter/c/aca169/32.png) [@Calvin\_Lieu](https://connective.celigo.com/u/Calvin_Lieu)
#### Post date: [September 5, 2025, 7:10pm UTC](https://connective.celigo.com/t/shopify-graphql-bulk-queries-and-mutations/5362/3 "2025-09-05T19:10:53Z")

</div>

Thanks Tyler,

I have followed the instructions, but when I switch onto the Google connection, it still prompts me that I have reached my maximum endpoints. See screenshot.

 ![image](https://us1.discourse-cdn.com/flex001/uploads/celigo/original/2X/c/c8ed34d9a64e88271737920214cfdda5259c286d.png)

---

<div class="post-metadata">

### Author: ![tylerlamparter](https://sea1.discourse-cdn.com/flex001/user_avatar/connective.celigo.com/tylerlamparter/32/9204_2.png) [@tylerlamparter](https://connective.celigo.com/u/tylerlamparter)
#### Post date: [September 5, 2025, 8:52pm UTC](https://connective.celigo.com/t/shopify-graphql-bulk-queries-and-mutations/5362/4 "2025-09-05T20:52:06Z")

</div>

Very odd. I'd request 1 additional endpoint from your account manager then.
