Shopify API maintenance, delivered as PRs

Every 90 days, Shopify breaks something.
Your app shouldn't notice.

PatchDrift watches every API version, finds the exact call sites in your codebase that break, and delivers verified fix PRs — reviewed by a human, ahead of the deadline.

28 breaking changes in version 2026-10 alone · scanning is free and needs no access · you pay only when a fix passes your CI

28breaking changes in version 2026-10 alone
157"Action Required" notices live in the changelog right now
4 / 6open-source apps we scanned were pinned to retired API versions
90 daysbetween versions. Each supported ~12 months, then silently gone

Measured from Shopify's own changelog and schema archives, July 2026. Shopify stopped publishing consolidated release notes after 2025-01 — assembling the impact is now your job. Or ours.

How it works

From version diff to merged fix.

STEP 01

Watch

Every API version schema-diffed against the last, every changelog entry parsed. We archive schemas Shopify retires — history you can't fetch anymore.

STEP 02

Locate

AST-level scan of your repo maps each change to file and line. No matches, no noise — most versions won't touch you at all.

STEP 03

Fix

Deterministic rules for the mechanical bulk; schema-grounded generation for the rest. Model memory is never trusted over the 2026-07 schema.

STEP 04

Verify

Build, types, your tests, and contract replay in a sandbox. Behavioral changes — same shape, different runtime — get flagged, never auto-fixed.

STEP 05

Deliver

A draft PR with per-line explanations, each citing the changelog entry it answers. A human reviews every PR. Merging is your verb.

Trust

A diff you can read beats a promise you can't audit.

Anyone can demo an agent that edits code. The hard part is one you'd let near the codebase your revenue runs on. Every limit below is architecture, not policy.

100%of PRs human-reviewed
0source files retained after a run
0test files ever edited by the agent
control ledgerenforced in architecture
C-01

Ephemeral clones, zero retention

Your repo is cloned for the run and destroyed after it. Nothing is stored, nothing trains a model.

C-02

Minimal scopes, your rules

Per-repo installation only. Branch protection and rulesets apply to us like any other actor; fork-based PRs if you prefer.

C-03

Code-never-leaves-CI option

Run the scanner inside your own CI. We see findings, not source.

C-04

Tests are read-only

The agent cannot touch test files — passing by weakening the test is structurally impossible, not just discouraged.

C-05

Confidence is declared, not implied

Each PR states what was verified: build, types, tests, replay. Low-confidence changes arrive as annotated issues, not diffs.

C-06

Behavioral changes wait for you

A quarter of Shopify's breaking changes alter runtime behavior without changing shape. Those get flagged with evidence — never silently patched.

Receipts

Caught before it shipped.

Not testimonials — artifacts from our own pipeline runs on real, unmodified open-source apps.

flagged · deprecated, not yet fatal

The field that still works, until it doesn't

A webhook registration passing callbackUrl. It validates fine today — the schema still accepts it, marked deprecated in favour of uri. Removal is the kind of change that ships in a quarterly release with a one-line changelog entry, so we report it now rather than the week it breaks.

WebhookSubscriptionInput @ 2026-07 ✓ valid ⚠ callbackUrl — deprecated, use `uri`
measured · july 2026

The fleet is quietly falling forward

Of six real open-source Shopify apps we scanned, four were pinned to API versions Shopify retired — one from 2020. Retired pins don't error. They silently "fall forward" onto changed contracts.

laravel-shopify pin 2022-01 retired core-web-vitals pin 2020-07 retired store-duplicator pin 2023-10 retired nextjs-app pin 2025-04 retired
shipped · a real migration, start to finish

REST to GraphQL, green on the customer's own CI

An inventory-sync package pinned to a retired version, writing stock through an endpoint with no concurrency protection. Two commits — the code fix and the test-fixture update kept separate so each can be reviewed on its own.

before 33 passed · 2 failed after 37 passed · 75 assertions PHPStan ✓ Pint ✓ PHP 8.3 + 8.4 Linux + Windows
archive · grows every quarter

We keep what Shopify deletes

Retired version schemas vanish from official endpoints. We archive every version — so when you finally migrate a 2023-era app, the contract it was written against still exists somewhere.

✓ 2025-10 … 2026-10 archived 5 versions · 4 diffs · 62 breaking changes next capture: version 2027-01
caught · the failure nobody sees

Tests that quietly stopped testing

Moving a driver from REST to GraphQL made its HTTP stubs match nothing. The tests didn't fail an assertion — the requests left the test process and hit Shopify for real, returning 401. Migrations void your mocks silently, so we check coverage before and after.

stub admin/api/2024-01/products.json ✗ no longer matched — request escaped to the network ✓ flagged pre-delivery, fixture updated, path re-covered
What you get for free

A number for your exposure, and a link for every point it cost you.

Most quarters, Shopify ships nothing that touches your code. The scorecard is what a quiet quarter looks like — proof we were watching, and where you actually stand.

50 / 100 RED
Version0
Contractn/a
Transport75
Deprecation100
Verification75

A Laravel inventory-sync package, before we migrated it.
Contract scores n/a — it had no GraphQL to check. Dimensions that don't apply are dropped from the weighting, never scored zero.

CRITICAL

Pinned to an API version Shopify retired

Every call targeted 2024-01. Retired versions don't error — requests fall forward to whatever the oldest supported version happens to be. The app had been running against a contract nobody chose.

weight 30% · scored 0shopify.dev · versioning ↗
HIGH

Inventory written through REST, with the URL assembled at runtime

Five call sites, none of which show a complete endpoint on any single line — the version was concatenated in from config. This is the shape that survives every grep-based audit.

weight 20% · scored 75shopify.dev · changelog ↗
HIGH

Stock updates with no concurrency protection

REST performs a blind absolute write. Two syncs racing each other silently overwrite — the mechanism behind most oversells. GraphQL's replacement takes a compare-and-swap baseline and rejects stale writes.

After the migration we delivered: 5095 GREEN

Every number here came out of the same tools we'd point at your repo, and every deduction carries the changelog entry that justifies it. Check the links — if a finding doesn't hold up, it shouldn't be on your invoice either.

Pricing

You pay when a vendor breaks something and we hand you a fix that passes your CI.

No seats. Watching is free forever — the bill only exists when there was real work to do.

FREE · NO ACCOUNT · NOTHING UPLOADED

Scan it yourself

  • One command, on your machine, not ours — there is nothing to grant us
  • Your scorecard, with the changelog entry behind every deduction
  • Connect a repo later if you want it watched continuously
patchdrift ./your-app
Ask for the CLI private beta — we send you a binary, you get a scorecard, we get nothing
$39 / REPO / MONTH · VOLUME BREAKS TO $15

Coverage

  • Makes a repo eligible for fixes and carries the guarantee
  • Unlimited re-scans and unlimited quotes, always free
  • If a change we were watching reaches your production without 30 days' notice, we refund the year and do the migration free
Get covered billed per repo-day · $149/mo account minimum, fully credited
The actual work

Verified Migrations, quoted before we touch anything.

Mechanical$400

1–10 call sites. Renames, path changes, header bumps.

Standard$900

11–40 call sites, or up to 5 breaking changes in one release.

Semantic$2,000

41–150 call sites, or anything that changes behavior rather than syntax.

ArchitecturalQuoted

Beyond 150 call sites, or migrations that need design decisions. Refusable, by both of us.

Your first migration is freeAny tier. You see the work before you pay for any of it.
Nothing bills without a quote you approvedThe file-and-line list comes first. Fix generation starts after you say yes.
The tier only ever moves downFewer call sites than quoted, you pay less. More, we eat it.
Not affected? That's $0"You're clear on 2026-10" is a deliverable, not an upsell.
One charge per repo, per releaseFollow-up PRs, re-runs after a red build, anything we missed — free by construction.
14 days to change your mindRevert it, or trace a regression to our diff, and the charge reverses.
Rush is +50%, and optionalInside 48h of a version drop. The normal queue is free with a 10-day SLA.
Agencies get 30% offPlus volume Coverage from your first repo, on a $2,000/mo commitment.

A migration becomes billable only when all five are true and on the record: the vendor published a dated breaking change · it touches your code · you approved the quote · the branch went green on your CI · a named human reviewed and signed the PR. Every one of those is a link on your invoice.

Questions you should ask

Fair questions, straight answers.

What access do you actually need?

For the free scan: read-only, or run it inside your CI so code never leaves. For fix PRs: a per-repo GitHub App install — opening a PR requires branch-push permission, which is exactly why C-02 through C-04 exist. Your branch protection applies to us like anyone else.

Our app has no tests. Doesn't that break your "verified" claim?

Most Shopify apps don't. Verification degrades honestly: build and type gates always run, contract replay substitutes for missing tests, and every PR states exactly which gates it passed. What we never do is claim confidence we didn't earn.

Shopify has an API health report and an AI assistant. Why you?

Shopify tells you what's deprecated — per call, with deadlines. It doesn't find the call sites in your code, write the fix, verify it, or open the PR. The .dev Assistant converts snippets; nobody ships you a reviewed diff. That last mile is the entire product.

Can't we just do this with Copilot or Claude?

For one migration, sure — many teams do, and the good ones budget days for review. What you can't get from a chat window: version schemas Shopify no longer serves, a watch on every future version, replay verification, and a fix pattern library refined across many apps. We sell the standing infrastructure, not the one-off prompt.

What stops you inventing work to bill for?

We can't. Every billable migration has to start from a dated breaking change the vendor published — we cite the changelog entry and you can open it. We can't mint those, Shopify can, roughly four times a year. On top of that: one charge per repo per release no matter how many PRs it takes, zero call sites means zero dollars, and the tier only ever moves down from what we quoted.

Isn't Coverage just a subscription with a different name?

It's written as a warranty, and it pays out like one. If a change we were watching reaches your production without us flagging it 30 days ahead, you get that repo's full year of Coverage back and the migration free. We also hold ourselves to Coverage staying under 30% of revenue — if it drifts above that we cut the price, because the moment the standing fee becomes the business we've stopped being paid for outcomes.

What if your fix breaks something in production?

The charge is provisional for 14 days after merge. Revert it, or trace a regression to our diff, and it reverses — across a billing period if need be. Before that: no PR reaches you without a human reviewer's name on it, and the agent is structurally barred from editing your tests, so it can never pass a gate by weakening one.