Summary
The Bulk Operation result URL (GCS signed URL) returned by the Shopify Admin API is CORS-blocked and cannot be fetched from the
browser on some shops. Even with the same app, same code, and same query, the behavior differs from shop to shop.
Reproduction Environment
- App: Shopify embedded apps (confirmed on multiple apps)
- Fetch method: Direct
GETrequest (axios/XHR) from the frontend against theurlfield of the bulk operation - Target: The bulk operation’s JSONL result file
Observed Bucket Assignment Differences
| Shop | Result Bucket | GoogleAccessId | Browser Fetch |
|---|---|---|---|
| capital-castle-demo | bulk-operation-intermediate-outputs-us-central1 |
shopify-core-tiers@shopify-tiers.iam.gserviceaccount.com |
|
| capital-castle-demo-3 | shopify-tiers-assets-prod-us-east1 |
assets-us-prod@shopify-tiers.iam.gserviceaccount.com |
|
| cc-testdemo-2 | shopify-tiers-assets-prod-us-east1 |
assets-us-prod@shopify-tiers.iam.gserviceaccount.com |
- Failing shops always use the
bulk-operation-intermediate-outputs-us-central1bucket - Succeeding shops always use the
shopify-tiers-assets-prod-us-east1bucket - A given shop consistently returns the same bucket (verified over multiple runs)
Browser Behavior on Failure
Access to XMLHttpRequest at ‘https://storage.googleapis.com/bulk-operation-intermediate-outputs-us-central1/…’
from origin ‘’ has been blocked by CORS policy:
No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
Failed to load resource: net::ERR_FAILED
Results of hitting both buckets with curl and an Origin header:
- Both buckets return 200
intermediate-outputs-us-central1returns noAccess-Control-Allow-*headersshopify-tiers-assets-prod-us-east1returns CORS headers
Historical Behavior
On capital-castle-demo, the fetch used to succeed (250 previously retrieved order records remain cached on the page). At some
point it began failing. Shopify may have changed the bucket assignment on the server side.
Hypotheses Ruled Out by Testing
Frontend domain difference
App dev vs prod build
Partners Dev Store vs regular store (all tested shops are Partners Dev Stores)
Duties and Taxes feature preview being enabled (both failing and succeeding shops have it enabled)
Requests
- Add CORS headers to the
bulk-operation-intermediate-outputs-us-central1bucket so its behavior matchesshopify-tiers-assets-prod-us-east1. - Alternatively, document the behavior where different shops receive different bulk result buckets (no such documentation
currently exists). - Alternatively, unify the pipeline so all shops return the same (CORS-enabled) bucket.
Relevant Official Documentation
Neither document mentions CORS constraints on the bulk operation url, nor that the returned bucket may differ between shops.