fix(source-shopify): upgrade Shopify API version from 2025-10 to 2026-07 - #83335
fix(source-shopify): upgrade Shopify API version from 2025-10 to 2026-07#83335devin-ai-integration[bot] wants to merge 2 commits into
Conversation
Co-Authored-By: bot_apk <apk@cognition.ai>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
👋 Greetings, Airbyte Team Member!Here are some helpful tips and reminders for your convenience. 💡 Show Tips and TricksPR Slash CommandsAirbyte Maintainers (that's you!) can execute the following slash commands on your PR:
📚 Show Repo GuidanceHelpful Resources
|
|
Note Autopilot progressive rollouts are not enabled for the following modified connector(s):
This is a courtesy heads-up only — it does not block merge or fail any check. |
|
Deploy preview for airbyte-docs ready!
Deployed with vercel-action |
|
Co-Authored-By: bot_apk <apk@cognition.ai>
|
↪️ Triggering Reason: Draft |
|
🧪 Fix Validation Evidence🟢 Outcome: Fix ProvenTwo independent regression-test runs (comparison mode, all 48 streams, Airbyte integration-test shop) put One real behavioral difference, and it is an improvement: on 🚦 Next Steps
📋 Connector & PR DetailsConnector: 📝 Evidence PlanThis is a proactive version bump ahead of Shopify's Oct 16, 2026 sunset, not a fix for an active customer symptom. Shopify's fall-forward policy means an expired pin degrades silently rather than hard-failing, so there is no "before" error to make disappear. The evidence goal was therefore equivalence + no regression while demonstrably exercising Proving Criteria
Disproving CriteriaTarget Cases Attempted
No customer connection was pinned or synced. Escalation to a customer ✅ Pre-flight Checks
📊 Detailed Evidence LogProtocol comparison (identical in both runs)
Criterion 4 — request URLs (run 2, debug logs)
Every URL moved; none appears on one side only. The Non-differences ruled out
Full log, including the per-stream record-count table and the |
|
|
↪️ Triggering Reason: |
Reviewing PR for connector safety and quality.
|
🛡️ AI PR Review Report🟢 Review Action: APPROVEDAll 12 gates passed. 🔶 Risk Level: 3/5One-line API version pin that shifts every REST and bulk request to a new Shopify Admin API version; blast radius covers all 48 streams, but two comparison regression runs show a byte-identical catalog and a record delta of 0. 📋 PR DetailsConnector(s): 🔍 Gate Evaluation DetailsGate-by-Gate Analysis
Notes on the diff
📚 Evidence ConsultedEvidence
|
|
↪️ Triggering Reason: |
Auto-merge evaluation: FAILPreconditions (all must pass)
Change scope (at least one must pass)❌ No matching change scope detected. |
|
🙋 Escalated to #human-in-the-loop per Hands-Free AI Triage Project triage next step. Reason: |
What
source-shopifyis pinned to Shopify Admin API version2025-10, which Shopify publishes as accessible only until October 16, 2026 15:00 UTC (supported versions table). After that date Shopify silently falls forward to the oldest accessible stable version, so behavior would drift unversioned rather than hard-fail.This moves the connector to
2026-07, the newest released stable version (accessible until July 16, 2027).2026-10is deliberately not targeted — it does not release until October 1, 2026.Same shape as the previous bump, #75255 (
2025-01→2025-10).Related to https://github.com/airbytehq/oncall/issues/11712:
How
ShopifyStream.api_versionis a single class attribute that is interpolated into both the REST base URL (/admin/api/{api_version}/) and the GraphQL/bulkgraphql.jsonURL, so the functional change is one line. The rest is test fixture URLs, the version bump, and the changelog.Review guide
source_shopify/streams/base_streams.py— the actual version pin.unit_tests/test_api_version.py— new test; asserts the pinned version is threaded through the real URL-building code paths (RESTurl_baseand the bulk job manager'sgraphql.jsonURL), so a future bump that misses one surface fails.unit_tests/test_limit_reducing_error_handler.py,unit_tests/integration/test_bulk_stream.py,unit_tests/test_discount_codes_sync.py— mock-server URLs.metadata.yaml,pyproject.toml,docs/integrations/sources/shopify.md— 3.5.1 → 3.5.2.Breaking-change evaluation
Not breaking: no schema, spec, PK/cursor, stream, or state changes. Patch bump. The connector has
enableProgressiveRollout: false, so no-rc.Nsuffix.Behavioral surface between
2025-10and2026-07that I checked against Shopify's docs (all subsequently confirmed empirically by the regression runs below):bulkOperationRunQuery.groupObjectsdefault flipped tofalsein2026-01(changelog); confirmed on the 2026-07 mutation reference (Default:false). The connector already passesgroupObjects: trueexplicitly inShopifyBulkTemplates.prepare, so this is a no-op — but that explicittrueis now load-bearing and must not be removed. An existing unit test asserts it is present.ProductVariant.taxCodeis deprecated but still queryable on2026-07(verified in the 2026-07ProductVariantreference). Left as-is; no schema change.2026-07(changelog) — documented as non-breaking; legacy members stay queryable. The connector'sCollectionbulk query does not selectruleSetat all, so no schema impact. See User Impact.updated_atand never filter on metafields (metafields are selected, not queried against), so this does not apply.2026-07(/admin/api/2026-07/…resource docs resolve). Many streams still use REST; a REST→GraphQL migration is explicitly out of scope here.User Impact
No user action required, no schema or config changes.
Two behaviors worth flagging:
collections.sort_orderis corrected. On2025-10the bulkcollectionsstream reported a collection whose true sort order ismost-relevantasBEST_SELLING, becauseMOST_RELEVANTdid not exist in the2025-10GraphQL enum and was coerced. On2026-07it reportsMOST_RELEVANT, matching what the RESTcustom_collectionsstream already returned. The field is typed["null", "string"]with noenum, so nothing breaks — the old value was simply wrong. Observed directly in the regression run; worth a line in release comms.collectionsmay return more rows. Shopify filters collections using new collection-model features out ofcollectionsqueries on pre-2026-07API versions, so shops using those features may see additional records — new rows, not changed ones. Not observed in validation (the test shop does not use those features), so this one remains untested.Test Coverage
Added
unit_tests/test_api_version.py(fails on the old pin). Full connector unit suite:270 passed.Live validation was subsequently run against the prerelease
3.5.2-preview.b71c9db: two regression runs in comparison mode over all 48 streams, control3.5.1(2025-10) vs. this build (2026-07).SPEC/CHECK/DISCOVER/READall pass on both sides, the discovered catalog is byte-identical, andREADemits 1658 records with a delta of 0 on every emitting stream. Debug-level request logging confirms every REST endpoint and the bulkgraphql.jsonURL actually moved to/admin/api/2026-07/, ruling out silent fall-forward — which is the part unit tests cannot cover. The only behavioral difference found is thecollections.sort_ordercorrection described above. Full evidence: #83335 (comment)Caveat: the integration-test shop is small (1658 records, 4 collections) and does not exercise new-collection-model features, so scale-dependent and new-collection-model behavior is untested.
Can this PR be safely reverted and rolled back?
Link to Devin session: https://app.devin.ai/sessions/00d2fd487dd542fb99460bfd9da0c1ef