SHOPIFY DEADLINE: 1 JAN 2027

Move your public app to expiring offline tokens

Shopify requires public apps to use expiring offline access tokens for Admin API requests. Non-expiring tokens get your app delisted on 1 January 2027 and hard-failed on 1 April 2027. We inventory your tokens, change the code, migrate dormant installs and hand over a cutover note - in about one week, at a fixed price.

1 Jan 2027
Public apps still using non-expiring offline access tokens are delisted from the Shopify App Store and blocked from new installs. Existing installs keep working.
15 Jan 2027
Merchants using the app see a warning in the Shopify admin - the moment your token hygiene becomes visible to your customers.
1 Apr 2027
Shopify rejects Admin API requests that present a non-expiring offline token (403). Merchants lose access to your app until they re-authenticate.

Sources: official Shopify migrate guide · Shopify developer changelog, 5 Nov 2026

The problem

Non-expiring offline Admin API tokens never rotate, so one leaked token is a permanent credential. Moving to expiring tokens is not a config toggle: it changes what your token exchange requests, what you store (access token, refresh token, expires_in and refresh_token_expires_in), when you refresh, and how you handle stores whose merchants never open your app.

Most public apps have three loose ends at once: old auth code still requesting non-expiring tokens, a token store with no refresh bookkeeping, and dormant installs that only a background migration can reach. Miss any one of them and on 1 April 2027 your app starts returning 403s to merchants mid-session.

Who this applies to: public apps calling the GraphQL or REST Admin API. It does not apply to custom apps, apps created by merchants, or Payments Apps API requests. Newly scaffolded apps already request expiring tokens.

Check if you still have non-expiring tokens (free, 5 minutes)

Shopify exposes this directly in your Partner Dev Dashboard:

  1. Open your app's Logs in the Dev Dashboard.
  2. Filter Type to GraphQL request, then filter Token type to Offline, non-expiring.
  3. If your app also makes REST Admin API requests, repeat with Type set to REST request.
  4. Any rows left = work to do before 1 January 2027.

Shopify's Token Expiry FAQ answers the common questions. If you would rather hand the whole thing to someone who has done it, that is what the two tiers below are for.

What we do in about a week

STEP 1

Audit your tokens

List every store still on a non-expiring offline token, from Dev Dashboard log filters plus your own token store - so nothing is migrated twice or missed.

STEP 2

Change the code

Enable expiring tokens the way your app is built: the expiringOfflineAccessTokens template flag, or expiring=1 on token exchange / authorization-code grant. Store refresh tokens and both expiry values; refresh before access expiry.

STEP 3

Migrate dormant installs

Background-only installs (webhook consumers, app proxies, Flow actions) never trigger a re-auth. We run Shopify's direct migration flow for them, so no merchant action is needed.

STEP 4

Cutover doc

A written note for your engineering and support teams: what changed, what was migrated, how refresh is handled now, and what to do if a 403 ever appears after 1 April 2027.

We never rewrite your whole auth stack - only the token acquisition, storage and refresh path. IP allowlist work is a separate service (see below).

Fixed prices

Migration
EUR 1,490
Inventory + rotate + cutover doc
  • Full non-expiring token inventory
  • Expiring-token code change (flag or expiring=1)
  • Token storage + refresh bookkeeping
  • Dormant-install migration via direct flow
  • Written cutover note for your team
Start - EUR 1,490
Migration + merchant notice
EUR 2,900
Everything above, plus the 15 Jan warning covered
  • Everything in Migration
  • Draft merchant-facing notice for affected stores
  • Ready for your review before the 15 Jan 2027 admin warning
  • Support-facing short FAQ for your helpdesk
Start - EUR 2,900

Fixed scope agreed in writing before we start. If your app turns out to be already fully on expiring tokens, the audit stops there and you pay nothing for the rest.

Related Shopify mandate

IP allowlist: every public Admin API app also needs an IP allowlist - bulk operations stopped working without one on 12 November 2026, and the app-wide deadline is 20 November 2026 with the same 1 April 2027 enforcement. Different job, same Partner Dashboard: IP Allowlist Rescue for public apps.

FAQ

We are a custom app, not a public app. Are we affected?

No. The timeline does not apply to custom apps, apps created by merchants, or Payments Apps API requests. It only applies to public apps calling the GraphQL or REST Admin API.

Our app was scaffolded recently. Do we need this?

Newly scaffolded apps already request expiring tokens through the expiringOfflineAccessTokens flag. Run the free Dev Dashboard log check above - if no rows show Offline, non-expiring, you are done.

What actually happens on 1 April 2027 if we do nothing?

Shopify rejects any GraphQL or REST Admin API request presenting a non-expiring offline token with a 403, and merchants lose access to your app until they re-authenticate. Existing installs only keep working until that date.

Why do dormant installs need special handling?

An install only migrates when your app acquires an expiring token - normally triggered by a merchant opening the app. Background-only installs (webhooks, app proxies, Flow actions) never do that, so Shopify provides a direct migration flow that uses the stored non-expiring token without a user session. We run that flow for every dormant store.

Do you need access to merchant data?

No. This is your Partner Dashboard, your code and your token store. We work with your permission inside your infrastructure; merchant data stays in your systems.

How do payments work?

Fixed scope, fixed price, invoiced. We agree the scope in writing first; payment terms are on the invoice.

Is Sipiteno affiliated with Shopify?

No. We are an independent engineering consultancy. Everything here follows Shopify's public developer documentation, linked above.