This guide walks you through setting up a custom Shopify integration in Parabola using your own Shopify app credentials. You’ll create an app in Shopify’s Dev Dashboard, configure it to work with Parabola, and authorize a permanent connection so your flows run automatically in the background without interruption. Before you begin, make sure you have:Documentation Index
Fetch the complete documentation index at: https://parabola.io/docs/llms.txt
Use this file to discover all available pages before exploring further.
- A Shopify account with app development permissions
- A Parabola account with a flow open and ready to connect
Set up your app in Shopify
Step 1: Create a new app
Log in to your Shopify account and navigate to the Dev Dashboard
Go to the Shopify Dev Dashboard.
Step 2: Create a version
Configure version settings
- From your app, click the Versions tab
- Set your App URL to:
https://shopify.dev/apps/default-app-home - Select the newest Webhooks API version
Add scopes
Under Scopes, add the permissions your integration needs. Common examples:
| Scope | What it allows |
|---|---|
read_orders | Pull order data into Parabola |
read_products | Pull product data into Parabola |
read_customers | Pull customer data into Parabola |
read_reports | Submit ShopifyQL queries |
read_analytics | Submit ShopifyQL queries |
Offline access: When selecting scopes, you’re granting Parabola permission to access your store in the background without you being actively logged in. In step 6 below, you’ll request a non-expiring token to make sure this access never interrupts your automated flows.
Step 3: Install your app on your store
- From the Dev Dashboard, scroll down on your app and click Install app
- Select your store and click Install
Step 4: Get your credentials
- From the Dev Dashboard, click Settings
- Copy your Client ID and Client Secret — you’ll need both in Parabola
Connect Shopify to Parabola
Step 5: Add an API step in Parabola
- In your Parabola flow, add a Pull from API step to import Shopify data
- In the step settings, open the Authentication dropdown and select Add expiring access token
Step 6: Configure the expiring access token
Set the access token request URL
In the Access Token Request URL (POST) field, enter:Replace
{your-store} with your Shopify store name.Add request body parameters
Add the following parameters:
client_secret→ your Client Secretclient_id→ your Client IDgrant_type→client_credentials
Configure request headers
- Set Content-Type to
application/x-www-form-urlencoded - Delete the Accept header
Configure token settings
- Response Access Token Field →
access_token - Header Key for using Access Token →
X-Shopify-Access-Token - Header Value for using Access Token →
{token}
Step 7: Pull from the GraphQL API
Configure the API request
- Select the pen icon near API Request Settings
- Switch the API Endpoint URL method to POST
- Enter the endpoint URL:
{your-development-store} with your Shopify store name.Use cursor pagination to pull more records
Shopify’s Admin GraphQL API caps how many records you can fetch in a single request (typically 250). To pull more, you must page through results using cursors — opaque tokens that point to the next page. Without pagination, your flow only ever sees the first page.How cursor pagination works in Shopify
Shopify paginates connection fields usingfirst + after:
- Request page 1 with
first: Nand noafter(orafter: null). - Shopify returns:
pageInfo.hasNextPage— whether more pages existpageInfo.endCursor— the token for the next page
- Request page 2 by sending
after: "<endCursor from page 1>". - Repeat until
hasNextPageisfalse.
How Parabola handles the loop
In the Pull from API step, Parabola swaps in a placeholder each request as it loops through pages.| Setting | What it does |
|---|---|
| Pagination style | Set to Cursor |
| Cursor key | The placeholder name in your query body (default: cursor, used as <%cursor%>) |
| Cursor path in response | Where Parabola reads the next cursor from the response |
| hasNextPage path | Where Parabola checks if it should keep paging |
| Pages to fetch while editing | Page cap when previewing in the editor (keep low, e.g., 5–200) |
| Pages to fetch while running | Page cap on full runs (e.g., 500+) |
- Send the request (cursor starts empty /
null). - Read
hasNextPageat the configured path. - Read
endCursorand substitute it into<%cursor%>for the next request. - Stop when
hasNextPageisfalseor the page cap is hit.
Step-by-step setup
Write the GraphQL query with <%cursor%> in the after argument
The first request will send
after: "". Shopify treats an empty string as “start from the beginning,” so no special handling is needed.Configure the pagination panel
Using the example query above (
data.orders), the settings are:| Field | Value |
|---|---|
| Pagination style | Cursor |
| Cursor key | cursor |
| Cursor path in response | data.orders.pageInfo.endCursor |
| hasNextPage path | data.orders.pageInfo.hasNextPage |
| Pages to fetch while editing | 200 |
| Pages to fetch while running | 500 |
Adapting the paths to your query
The response paths must match the shape of your GraphQL response, which mirrors the shape of your query. Example A —orders
- Query root:
orders { ... pageInfo { ... } } - Cursor path in response:
data.orders.pageInfo.endCursor - hasNextPage path:
data.orders.pageInfo.hasNextPage
shopifyPaymentsAccount.balanceTransactions
- Query root:
shopifyPaymentsAccount { balanceTransactions { ... pageInfo { ... } } } - Cursor path in response:
data.shopifyPaymentsAccount.balanceTransactions.pageInfo.endCursor - hasNextPage path:
data.shopifyPaymentsAccount.balanceTransactions.pageInfo.hasNextPage
products
- Cursor path in response:
data.products.pageInfo.endCursor - hasNextPage path:
data.products.pageInfo.hasNextPage
Common pitfalls
- Wrong paths. If
data.orders.pageInfo.endCursordoesn’t match your actual response shape, Parabola will only pull page 1. Run the query once, inspect the response, and confirm the path before turning on pagination. - Forgot
<%cursor%>in the query. The placeholder must appear in theafter:argument. Without it, Parabola has nowhere to inject the cursor. - Paginating a non-connection field. Only fields that return
pageInfo(connections) support cursor pagination. Singletons likeshop { ... }do not. - Editing page cap too low. If you cap at 5 pages while editing, your preview will look truncated — that’s expected. The run-time cap is what matters for production.
- Using
firstlarger than Shopify allows. Most connections cap at 250. Going higher returns an error. - Rate limits. Long pagination loops can hit Shopify’s cost-based rate limit. If you see throttling, lower
firstor add a delay.
Need to add more scopes?
If you need to grant Parabola access to additional Shopify data after your initial setup, you can update your app’s scopes without disrupting your existing connection.- Click on your app in the Dev Dashboard
- Click on the Versions tab
- Click Create Version in the upper right
- Select Scopes under Add Access and add the ones listed above
