Explainer 8 min read

Theme Access Password vs Admin API Token: Which One Do You Need?

Two Shopify credentials with confusingly similar jobs. Asking a client for the wrong one costs you a week of back-and-forth β€” and asking for too much costs you their confidence.

TS
ThemeSync Team
WHAT EACH SHOPIFY CREDENTIAL ACTUALLY UNLOCKSTHEME ACCESSADMIN API TOKENSTAFF / COLLABPull & push theme filesYesNoYesRun the CLI without a browserYesn/aNoList real products & pagesNoYesYesPublish a themeYesYesYesRead orders & customersNeverIf scopedOftenRevoke without breaking staffYesYesNoLeast privilege wins: request only the row you need.

Why the wrong ask costs you a week

Every client project starts with the same email: "Can you give me access to the store?" What happens next decides whether you're building on Tuesday or still waiting on Friday.

Ask for "admin access" and you've handed the merchant a decision they're not qualified to make quickly. Their finance lead gets involved. Someone asks whether you'll be able to see revenue. The request sits for four days and comes back as a staff invite with the wrong permissions, or a shared login you shouldn't be using.

Ask for a Theme Access password and you've asked for something narrow, revocable, and obviously safe. It takes the merchant about ninety seconds and no internal approval.

The commercial framing: asking for the minimum isn't just good security hygiene, it's a signal. Requesting theme-only access on day one tells a client you've done this before. Asking for the keys to everything tells them you haven't.

Theme Access password: for moving theme files

A Theme Access password comes from Shopify's Theme Access app, which the store owner installs. They enter your email, Shopify generates a credential prefixed shptka_, and it's emailed to you directly β€” the merchant never sees the token.

It grants exactly one thing: theme read and write on that one store. No orders, no customers, no payouts, no app management.

What makes it the right default

  • No staff account required. On Shopify plans, staff seats are finite and adding contractors to them is a real cost. This sidesteps that entirely.
  • Non-interactive. The CLI can authenticate from config instead of opening a browser, which matters for automation and for keeping a long-running dev session alive.
  • Independently revocable. Project ends, merchant uninstalls the app or deletes the password. Nothing else in their store is affected.
  • Per-store by design. One credential can't accidentally reach a different client's store.
Using it non-interactively β€” shopify.theme.toml
[environments.default]
store = "client-store.myshopify.com"
password = "shptka_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
theme = "123456789"

With that file present the CLI reads auth from config, so theme pull, theme push and theme dev all run without a browser round-trip. That's also what stops an interactive logout from deleting a development theme mid-project.

Treat it like a deploy key. It can overwrite a live theme. Keep the toml out of version control, restrict file permissions to the user running the CLI, and store it encrypted if your tooling holds it for you.

Admin API token: for knowing what’s on the store

A Theme Access password moves files. It can't tell you that the store has a product called "Variety Pack" at /products/variety-pack. For that you need an Admin API token from a custom app, which the merchant creates in Settings › Apps and sales channels › Develop apps.

The token is prefixed shpat_ and does only what its scopes allow. For theme work, read-only scopes are enough:

ScopeWhat it lets you do
read_productsList real products and collections so a product template can be previewed on an actual product URL
read_contentList pages, blogs and articles β€” needed for page and article templates
read_themesRead theme metadata and asset lists; confirm which theme is live
write_themesOnly if you need to rename, duplicate or publish themes programmatically

Why this matters for client review

Without it, previews get generic. You send a link to a product template attached to whatever product happens to be first in the catalogue, and the client reviews a page that isn't representative. With it, each template gets pinned to the real page it applies to β€” the actual bundle product, the actual lookbook page β€” so what the client reviews is what their customers will see.

Ask for read scopes only, and say so in the request. "Read-only access to products and pages so previews show your real catalogue" gets approved. "Admin API access" gets escalated.

The third option: collaborator accounts

A collaborator request is a Partner-account request for access to a client store. It doesn't consume a staff seat, and the merchant can grant section-by-section permissions β€” themes only, if they choose.

It's genuinely useful, but it solves a different problem: it gets you, the human into the admin. It doesn't give a long-running process a credential. If you need to click around the theme editor, check an app's settings, or look at what a merchant is describing, a collaborator account is the right tool.

You need to…Request this
Push and pull theme files, run a dev serverTheme Access password
Map templates to real products and pagesAdmin API token, read scopes
Look around the admin yourselfCollaborator request, themes permission
Configure apps, check settings, debug the checkoutCollaborator request, wider permissions
Read orders, customers or payoutsAlmost certainly nothing β€” don't ask

Most Shopify theme projects want the first two, and often the third. Very few want anything beyond that.

How to ask so you get it the same day

Access requests stall because they're vague and the merchant can't tell what they're agreeing to. Be specific about scope, purpose and reversibility, and the objection disappears.

CREDENTIAL REQUEST THAT CLEARS IN A DAY1Name the scopeSay "theme files only, noorders or customers" inthe first sentence.no ambiguity2Theme AccessThey install the app,enter your email. Shopifysends you the passworddirectly.~90 seconds3Read-only APICustom app withread_products andread_content so previewsuse real pages.read only4Close it outRevoke both at project endand tell the client youdid. It builds trust forthe next one.reversibleNarrow, named, reversible. Nothing to escalate.

Wording that works

Something close to this tends to get approved without a meeting:

"To build and preview the theme I need two things, both theme-scoped and both revocable: a Theme Access password (install Shopify's Theme Access app, enter my email β€” it emails the credential straight to me, you never handle it), and a read-only custom app token with products and pages access so previews show your real catalogue instead of placeholders. Neither can see orders, customers or payouts. I'll confirm in writing when both are revoked at project close."

If you send client-facing emails often, it's worth keeping this as a template.

Credential hygiene across a client portfolio

One store is easy. Fifteen is where this becomes a liability. Two failure modes show up repeatedly at agencies:

  1. Tokens in plain text. Theme Access passwords in a shared spreadsheet, a Slack DM, or committed .env files. Every one of those can overwrite a live store.
  2. Nothing gets revoked. Projects end, developers leave, credentials keep working. Two years later a former contractor still has theme write on a store you're responsible for.

What holds up at scale:

  • One credential per store, never reused across clients
  • Stored encrypted at rest, not in a spreadsheet or a chat thread
  • Written to CLI config at run time and scoped to that session, rather than living permanently on developer laptops
  • Revoked at project close as a checklist item, with the client told it happened
  • Rotated when someone leaves the team
The uncomfortable test: if a developer left today, could you list every client store they can still write to? If not, that's the gap to close first.

How ThemeSync handles credentials

  • Credentials are stored once per store, encrypted at rest. Theme Access password and Admin API token live against the store, not in a spreadsheet and not on individual laptops.
  • CLI config is written at run time. Auth is placed where the Shopify CLI needs it for the duration of a session with restricted permissions, rather than persisting in a checked-out repo.
  • Non-interactive by default. Because auth comes from config rather than a browser login, long-running dev sessions don't get killed by a logout β€” which is what otherwise deletes a development theme.
  • The API token powers template mapping. Read scopes on products, collections, pages and blogs are what let each template be pinned to the real URL it applies to, so client previews show real pages.
  • Team members share store access without sharing tokens. Designers and QA work against a store through their role, and no one needs the raw credential pasted to them.

The practical effect is that "who can write to this client's live theme" has an answer you can give in one sentence.

Takeaways

  • Theme Access password (shptka_) moves theme files. It's the right default ask, needs no staff seat, and works non-interactively.
  • Admin API token (shpat_) with read scopes lets you list real products and pages, which is what makes previews representative instead of generic.
  • Collaborator accounts get a human into the admin. Different job β€” request one when you need to click around.
  • Never ask for order or customer access for theme work. There's no reason to have it and it slows approval to a crawl.
  • Ask narrowly and explain reversibility, and access lands the same day instead of the following week.
  • One credential per store, encrypted, revoked at close. If you can't audit who has theme write on which store, start there.

Store credentials, handled once

ThemeSync stores each client’s Theme Access password and API token encrypted per store, and hands the CLI what it needs at run time β€” so sessions stay alive and tokens stay off laptops.

Try ThemeSync Free →