Connect Shopify
Connect your Shopify store's blog to SerpPal with a Dev Dashboard app (client ID and secret) or an older Admin API token, then publish articles with images.
SerpPal publishes to your Shopify store's blog through the Shopify Admin API. Each post becomes a blog article, with its images copied to your store's Files so they load from Shopify's own servers.
Since January 2026, Shopify no longer lets you create new custom apps inside the store admin. New apps are made in the Shopify Dev Dashboard, and they connect with a client ID and client secret instead of a token you copy. SerpPal supports both kinds:
| Your app | What you enter in SerpPal |
|---|---|
| A new app made in the Dev Dashboard | Client ID and Client secret |
| An older custom app made in the store admin before 2026 | Admin API access token (starts with shpat_) |
Before you start
- Your store needs a blog. In Shopify, go to Online Store, Blog posts, Manage blogs and make one if the list is empty. Shopify stores usually start with one called "News".
- You need to be the store owner, or a staff member allowed to develop apps.
- The app must belong to the same Shopify organization as the store. The client ID and secret only work for stores in the app's own organization, so create the app while signed in to the account that owns the store.
Option A: a Dev Dashboard app (recommended)
Step 1: Create the app
- In your Shopify admin, go to Settings, then Apps, then Develop apps, and choose to build apps in the Dev Dashboard. (You can also open the Dev Dashboard directly from your Shopify account.)
- Click Create app and name it, for example
SerpPal.
Step 2: Give it the right permissions
- Create a version of the app. In its Admin API access scopes, add:
write_content: lets SerpPal create and update blog articles.write_files: lets SerpPal copy images and videos into your store's Files.
- Release the version. An app needs a released version before you can install it.
Step 3: Install it on your store
From the app in the Dev Dashboard, install it on your store and approve the permissions.
If you add a scope later, release a new version and approve the new permissions on your store. Until you do, the store keeps the old permissions and SerpPal shows "the token is missing the ... permission".
Step 4: Copy the client ID and secret
Open the app's Settings in the Dev Dashboard and copy the Client ID and the Client secret (the secret starts with shpss_).
Step 5: Connect in SerpPal
- In SerpPal, open your project, click Project settings, and under Publishing click Connect a site.
- Choose Shopify and fill in:
| Field | What to enter |
|---|---|
| Store address | Your store's .myshopify.com address, for example mystore.myshopify.com. Just mystore works too, and so does a link to your admin like admin.shopify.com/store/mystore. Your own domain (like shop.com) does not work here. |
| Client ID | From the app's Settings. |
| Client secret | From the app's Settings. |
| Admin API access token | Leave empty. |
| Author name | Optional. Shown as the article's author, for example Store team. |
- Click Connect. SerpPal asks Shopify for an access token, checks the permissions and lists your blogs.
- If your store has more than one blog, pick one under Blog and click Save and test.
Shopify's tokens from a client ID and secret last 24 hours. SerpPal gets a fresh one by itself whenever it needs one, so you never have to update anything.
Option B: an older custom app with a shpat_ token
If you made a custom app in your store admin before 2026, you can keep using it.
- In Shopify, open Settings, Apps, Develop apps and open your app.
- Make sure its Admin API scopes include
write_contentandwrite_files. If you change them, reinstall the app (Shopify then shows a new token). - Under API credentials, copy the Admin API access token. It starts with
shpat_. - In SerpPal, choose Shopify, enter the Store address, paste the token into Admin API access token, and leave Client ID and Client secret empty.
The API key (32 letters and numbers) and the API secret key (starts with shpss_) of an old app are not the access token. SerpPal tells you if you paste one of those into the token field.
What SerpPal sends to Shopify
- Title and body. The first H1 is left out, because your theme shows the article title.
- Handle: the slug you set, so the address is
/blogs/<blog>/<slug>. - Summary: the excerpt.
- Tags: your tags and categories together, as Shopify tags (Shopify has no categories).
- Author: the Author name from the connection, if you set one.
- Visibility: Live post makes the article visible. Draft to review saves it as hidden.
- Featured image: set as the article's image. Shopify copies it from SerpPal.
- Images and videos in the article: copied to Content, Files in your Shopify admin and served from Shopify. Videos can take up to about a minute and a half to process. If Shopify can't take a file in time, the post links to SerpPal's copy instead, so it still shows.
After a live post, SerpPal shows the article's address on your .myshopify.com domain. Shopify sends visitors from there to your main domain.
Publishing the same article to the same store again updates the existing article. If it was deleted in Shopify, a new one is made.
Troubleshooting
"Shopify: the client ID or client secret was not accepted..." Copy both again from the app's Settings in the Dev Dashboard. Check that the app is installed on this store, and that the store belongs to the same organization as the app.
"Shopify: the token is missing the write_content permission" (or write_files) Add the scope to the app, release a new version, and approve it on your store. For an older custom app, add the scope and reinstall it, then paste the new token.
"Shopify: enter your store's .myshopify.com address..." Use the .myshopify.com address, not your own domain. Find it in Shopify under Settings, Domains.
"Shopify: this store has no blog yet..." Make a blog under Online Store, Blog posts, Manage blogs, then click Test in SerpPal.
"Shopify: the chosen blog no longer exists..." The blog was deleted or renamed. Click the pencil on the connection, pick a blog again and click Save and test.
"Shopify did not accept the article: handle has already been taken" Another article in that blog already uses this slug. Change the Slug in the publish dialog.
"Shopify: this store is frozen or unpaid" or "this store is locked" Shopify doesn't allow changes to the store right now. Sort out the store's status in Shopify, then click Try again on the post.
More fixes are in Publishing troubleshooting.