Playbook · Shopify GraphQL bulk operations stuck / never completing

Shopify GraphQL bulk operations stuck / never completing — bulkOperationRunQuery, webhook, app jobs, throttle.

Written for a Shopify owner or ops lead whose apps hang on bulk product / order / inventory sync — GraphQL bulkOperationRunQuery stays RUNNING, never finishes, or the app never downloads the JSONL. DIY-first: prove currentBulkOperation status and whether BULK_OPERATIONS_FINISH fired; walk the one-bulk-at-a-time rule, app job workers, and Admin API throttle; then stop confusing this with general webhook delivery or a blank admin iframe. Distinct from webhooks not delivering, admin app blank after install, and POS inventory not syncing. No earnings claims, no invented case studies.

Nico at Latch AI Ops · Sep 10, 2026 · ~11 minute read

Buy the 72-hour install — $997WebhooksAdmin blank appMerchant FAQ

01

GraphQL bulk ops stuck — not webhooks, Storefront throttle, blank admin app.

Several products can look like “the app never syncs.” They do not share a settings panel. This page is only when Shopify Admin GraphQL bulk operations (bulkOperationRunQuery / bulk mutations) hang, stay RUNNING, cancel without a URL, or finish without your app ever processing the JSONL — so product, order, or inventory sync never completes. General Admin / app webhook POSTs failing HMAC or HTTPS is webhooks not delivering. A blank white iframe after install is admin app blank after install. POS stock not matching online is POS inventory not syncing. Storefront API cost limits on Hydrogen / headless reads are a different surface from Admin bulk ops — do not treat storefront throttle dashboards as proof this bulk job is healthy. This page is only: Shopify GraphQL bulk operations stuck / never completing.

Six ordinary reasons bulk sync dies while the rest of the app looks fine: an orphan RUNNING bulk op blocking the shop’s single slot, BULK_OPERATIONS_FINISH webhook not subscribed or not reaching your worker, app job queue paused / crashed after the webhook, query too wide so the op cancels or never yields a usable URL, Admin API throttle starving the poll loop, or you are debugging general webhooks / blank admin / POS inventory instead of the bulk operation. Walk them in that order. You already pay for Shopify and usually a sync / ERP / inventory app. You do not need another “sync SaaS” to read currentBulkOperation and the finish webhook.

02

Prove currentBulkOperation status, JSONL URL, and finish webhook.

In GraphiQL / the app’s debug panel, query currentBulkOperation (or the specific operation ID your app stored when it called bulkOperationRunQuery). Note status (CREATED, RUNNING, COMPLETED, CANCELING, CANCELED, FAILED), objectCount, errorCode, createdAt, and whether url is null. Screenshot the response and the app’s “sync in progress” UI before you cancel or re-run anything.

Then check webhook delivery for BULK_OPERATIONS_FINISH (topic name may appear as bulk_operations/finish in Admin). If the op shows COMPLETED with a URL but your app never moved, the hang is after Shopify — your worker never fetched JSONL. If the op is still RUNNING for hours with flat objectCount, the hang is inside Shopify’s bulk pipeline or a query that will never finish cleanly. Honest fork: if every webhook topic fails HMAC / HTTPS (not just bulk finish), leave this page and use webhooks not delivering. If the admin app iframe is blank so you cannot even open sync settings, that is admin app blank after install.

03

Walk one-bulk-at-a-time, app jobs, and Admin API throttle.

Shopify allows one bulk operation per shop at a time. If a previous sync left a RUNNING or CANCELING op, every new bulkOperationRunQuery fails or queues forever in the app UI. Cancel the orphan (bulkOperationCancel) only after you screenshot status, then start one clean run. Confirm no second app on the same shop is also holding the bulk slot (ERP, migration tool, inventory connector).

App jobs matter as much as Shopify: after COMPLETED + URL, your worker must download JSONL, parse lines, and write products / orders. A dead Redis/Sidekiq/Cloud Tasks queue looks identical to “Shopify stuck” in the merchant UI. Check worker heartbeats and last successful bulk finish timestamp. Separately, Admin API throttle / cost limits can starve a poll loop that never subscribed to BULK_OPERATIONS_FINISH — prefer the webhook, then poll as backup with backoff. Storefront API throttle dashboards do not explain Admin bulk hangs; keep those surfaces separate.

04

Query shape, cancel stuck ops, and restart cleanly.

Over-broad bulk queries (every product + every metafield + every media connection in one run) cancel, fail, or run so long ops assumes the app is dead. Narrow the query: page by updated_at, drop unused connections, split products vs orders vs inventory into separate bulk runs. After cancel, wait until currentBulkOperation is null or COMPLETED/CANCELED with no RUNNING sibling before starting the next mutation.

Restart checklist: (1) screenshot currentBulkOperation, (2) cancel only if stuck RUNNING with no progress, (3) confirm BULK_OPERATIONS_FINISH subscription + HTTPS endpoint healthy, (4) confirm app workers are up, (5) run one smaller bulk query, (6) verify JSONL download + row counts in the app. If the app vendor owns the bulk client, send them the operation ID + status + webhook delivery log — that is enough for their eng to act without a full store rebuild.

05

You tested webhooks, Storefront throttle, or blank admin app instead.

HMAC / HTTPS failures across many topics is webhooks not delivering. Blank admin iframe after install is admin app blank after install. POS vs online stock mismatch without a bulk sync UI hang is POS inventory not syncing. Theme / metafield storefront display issues are metafields not showing on storefront. None of those fix a GraphQL bulkOperationRunQuery that never completes or a finish webhook your workers never handled.

Finish currentBulkOperation proof → one-bulk-at-a-time / jobs / Admin throttle → query shape / cancel / restart first. Only then open the related playbook that matches the remaining symptom.

06

When to stay DIY vs pay $997.

Stay DIY if you can spend one afternoon on the list above: prove currentBulkOperation status and finish-webhook delivery, clear the one-bulk-at-a-time slot, revive app workers, narrow the query, and stop confusing general webhooks / blank admin / POS inventory with a hung bulk op. That is the whole playbook. No agency required. Short answers also live on the merchant FAQ. Related pages: webhooks not delivering, admin blank app, POS inventory, metafields on storefront.

Pay for help when the work is not the GraphQL bulk panel — it is connecting the stack you already have so lead capture is not dying in DMs, bulk-sync hang exceptions land in a channel you already check, and the live store is one workflow instead of a spreadsheet plus a Slack bot you forgot. That is the Latch AI Ops install.

What $997 USD one-time buys: lead capture on the live store, ops alerts in a channel you already check, and a checkout-ready workflow. 72 hours after collaborator access, not after payment. One live Shopify store. Access plus a delivery thread. Store URL collected at checkout. Not a SaaS seat, not a sync-app retainer, not a conversion guarantee, not a brand or theme job.

Other shops’ public ranges, not testimonials: a checkout / ops install typically runs $500–$2,500. A full ops consulting block typically runs $2,000–$5,000. $997 is the cheap end of that work, sold as a 72-hour install of three systems — not as an earnings number or sync-uptime claim.

What it does not buy: more orders, faster Shopify bulk throughput forever, a sync app license, or a case study. Latch AI Ops has not published customer proof because there are no customers yet. You are buying the install.

Checkout is on Whop. Operator is Nico. United States offer. You can revoke collaborator access after handoff. We do not take owner passwords.