Hey @Lucy_hutchinson - a couple of things jumping out at me here that should get you sorted.
1. The missing products could be due to your date range filter
Your query filters to created_at:<=2026-01-01, but we’re now in March 2026. Any products created after January 1st would be excluded. For a store with 1717 products, that could easily account for the 705 you’re missing.
If your goal is simply “all products regardless of when they were created”, you can drop the date range entirely and just filter by status.
2. Status filter syntax
The GraphQL equivalent of REST’s status=any is a comma-separated list without quotes:
status:active,archived,draft
In your original query you’re using status:'active' OR status:'archived' OR status:'draft', while the OR precedence should technically group correctly, the comma-separated syntax is the documented approach for this filter and avoids any ambiguity.
When you tried the comma-separated version and got the "Input active,archived,draft is not an accepted value" error, it looks like the values were wrapped in quotes (status:'active,archived,draft'). Single quotes in the search syntax create a phrase match, so Shopify sees that as one literal string. Drop the quotes and it should work.
3. Simplified query
Putting it together, here’s a cleaned-up version:
query ($cursor: String) {
products(first: 250, after: $cursor, query: "status:active,archived,draft") {
edges {
cursor
node {
id
legacyResourceId
title
productType
status
category {
id
name
}
createdAt
updatedAt
variants(first: 250) {
edges {
node {
id
displayName
legacyResourceId
createdAt
updatedAt
sku
title
price
compareAtPrice
inventoryItem {
id
legacyResourceId
unitCost {
amount
currencyCode
}
}
}
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
Pass $cursor as null for the first request, then use the endCursor value from each response for subsequent pages — which it looks like you’re already doing correctly.
4. On the taxonomy/category field
Good news here: the category { id name } field you’re using in GraphQL maps to the Shopify Standard Product Taxonomy. This is actually one of the advantages of moving to GraphQL. The REST API only exposes the free-text product_type field, so the structured taxonomy data is a GraphQL-only feature. You’re already pulling it correctly in your query.
Let me know if you’re still seeing a mismatch in product counts after removing the date filter — if so, share the x-request-id header from the response and I can dig in further on our end.