Reference

Forward-Deploy Guideline — Server-Side GraphQL + Agentic Workflows + Tool Runner

Audience: merchants, app developers, and platform teams planning their Shopify roadmap. Thesis: Shopify's 2025–2026 deprecation cliff retires the client-side / REST / Script-Editor era. The durable forward path is server-side GraphQL workflows orchestrated by an agentic Tool Runner. This guideline turns the deadlines into a migration plan.

As of: 2026-06-21 · Review: quarterly (Shopify versions sunset on a rolling schedule). All dates below are Shopify-published deadlines — plan each pillar against them.


1. The forcing function (why now)

DateWhat endsWhat it forces
Oct 1, 2024REST Admin API marked legacyNew build must be GraphQL-first
Apr 1, 2025New public apps must be GraphQL-onlyREST skills stop compounding
Jan 1, 2026Can no longer create legacy custom appsMove to managed install + token exchange
Jun 30, 2026Shopify Scripts removed (payment/shipping/line-item)Checkout logic must be server-side Functions, not Script Editor
Rolling (quarterly)API versions sunset ~12 months after releasePin a current version; automate the bump

The pattern across every row is the same: logic that lived in the browser, in REST, or in the Script Editor is moving to the server, to GraphQL, and to declarative Functions. Once you accept that, the question is not whether to go server-side — it's what orchestrates the server-side calls. That orchestrator is the opportunity.


2. The shift in one line

Client-side scripts + REST polling → server-side GraphQL workflows invoked by an agentic Tool Runner.

This is the same three-layer split agents already expect: discovery → authorization → execution, with the Tool Runner as the execution plane.

The anti-pattern this replaces

The common "before" state is a Liquid theme stuffed with client-side JavaScript doing the real work: cart math, eligibility rules, price/inventory display, third-party calls, and personalization all run in the browser, glued to Liquid templates. It feels fast to ship and ages into a trainwreck:

Forward-deploy inverts this: the browser renders, the server decides. Liquid (or any front end) becomes a thin presentation layer; cart/checkout rules become Functions; data and side effects become GraphQL behind the Tool Runner. Same UX, but the logic is now typed, server-held, agent-callable, and survives the next deprecation.


3. Migration map (retire → forward-deploy)

RetiringForward-deploy target
Payment / shipping / line-item ScriptsShopify Functions (server-evaluated), invoked + monitored via the Tool Runner
REST endpoints / pagination loopsGraphQL queries + bulk operations; one round-trip, typed results
Client-side cart/checkout JS doing business rulesServer-side GraphQL (draft orders → mark-paid) + Functions
Legacy custom app install / pasted tokensManaged install + token exchange (offline id_token), secrets server-side only
Per-channel bespoke integrationsMCP tools on a single Tool Runner, reused across chat / agents / storefront
Manual API-version chasingPinned current version (e.g. 2026-04) + a CI bump + a deprecation watch

4. The forward-deploy pillars

The migration above becomes real through nine workstreams. Each one moves logic from the client/Liquid/REST era to a server-side GraphQL operation behind the Tool Runner, and each is independently shippable (see Code split).

#PillarForward-deploy moveRetires / fixes
1Dawn → Horizon theme migrationAdopt Horizon (sections/blocks, web-component-friendly) as a thin presentation shell over server-resolved dataDawn's Liquid-heavy, client-JS theme doing business logic
2Code splitShip + scale each concern independently — theme, worker, extension, edge Functions; lazy-load surfacesMonolithic theme bundles; one deploy blast radius
3Dynamic Catalog–PIM renderHydrate catalog / PDP from the PIM at the edge; PIM is the product source of truth, GraphQL is the read pathProduct data hardcoded in Liquid; drift between feed and storefront
4Compliance + GID/UUID pairing in UCPEvery entity carries the Shopify GID and a portable UUID so consent, audit, and the UCP funnel are traceable end-to-endUntraceable identity; consent/omnibus/CPRA gaps; cross-system joins by guesswork
5SecurityServer-side secrets, managed install + token exchange, fail-closed guardrails, a rotation runbookPasted custom-app tokens, client-side secrets, last-writer-wins config
6ScalingEdge workers + GraphQL bulk operations + caching; quota-aware batchingREST polling, per-row loops, rate-limit cliffs
7FailoverPluggable sockets/rails with health checks and graceful degradation (settlement, search, translation)Single-point integrations that take checkout down with them
8UI components — Wallets / omni-channel paymentsComposable wallet rails (Google Pay, Apple/Samsung, Kakao) bound to identity + an AP2 mandate, settling via swappable PSP sockets per market and channelBespoke per-channel checkout JS; one-rail lock-in
9Globalization — LLM / m2m100 / bge-m3Edge translation (m2m100 + HTMLRewriter), multilingual semantic search / RAG (bge-m3 embeddings), LLM-localized answers — one functional core serves every localePer-locale theme forks; English-only KB; manual translation drift

These are not sequential — they share the same spine (GraphQL record + Functions logic + Tool Runner orchestration), so a team can forward-deploy them in parallel and retire the Liquid/JS trainwreck pillar by pillar.

Date anchors (plan backward from these)

DeadlineDatePillars it gates
Legacy custom apps can't be created2026-01-01 (passed)5 Security — managed install + token exchange is table stakes now
Shopify Scripts removed2026-06-301 Theme, 8 Wallets/Payments, and any line-item discount logic → must be Functions / server-side by this date
API version sunsets (rolling)quarterly (~12 mo after release)5 Security, 6 Scaling — own the version bump + a deprecation watch
No Shopify deadline—2 Code split, 3 Catalog-PIM, 4 GID/UUID, 7 Failover, 9 Globalization — paced by your roadmap, but they unblock the dated ones

The only hard external clock is 2026-06-30. Everything checkout-touching (themes, wallets, discount rules) is forward-deployed to server-side Functions before then; the rest is sequenced to support it.


5. Why server-side + Tool Runner (not just "GraphQL")

  1. Agent-ready by construction. An MCP Tool Runner is already the interface agents (and your own chatbot) call. Going server-side GraphQL without a tool layer just moves the spaghetti; the Tool Runner makes each operation discoverable, typed, and permission-gated.
  2. Credential containment. Secrets, the Shopify token, payment/settlement keys live on the edge worker — never in the browser, never in the agent. (This is also the posture the deprecations push you toward: token exchange, no pasted custom-app tokens.)
  3. Durability against the next deprecation. When an API version sunsets or a Function input changes, you update one tool implementation — not every caller. The contract the agents see is stable; the Shopify call underneath is swappable.
  4. Cross-channel reuse. The same search_products / agentic_checkout / resolve_market tool serves the chatbot, an external agent (AP2/UCP), and the storefront — one build, many surfaces.
  5. Lock-in avoidance. A functional core of Shopify GraphQL + Functions plus your own orchestration displaces single-vendor middleware; the agent layer is yours, not rented.

6. Forward-deploy checklist


7. The one-sentence pitch

Shopify is deleting the client-side era on a published timeline; forward-deploy now to server-side GraphQL + Functions behind an agentic Tool Runner, and every future deprecation becomes a one-file change instead of a fire drill.