> ## Documentation Index
> Fetch the complete documentation index at: https://help.semji.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Shopify integration: connect your store to publish from Semji

> Connect Shopify to Semji with a Dev Dashboard app so agents can read, update and translate blog posts, pages, collections and products.

Semji connects to Shopify through the **GraphQL Admin API**, with an app you
create for Semji in your store's **Shopify Dev Dashboard**. You give Semji the
app's **Client ID** and **Client secret**: Semji exchanges them for an Admin
API access token valid 24 hours (Shopify's client credentials grant) and
renews it on its own. Once connected, Semji's AI agents can work on **blog
posts**, **pages**, **collection descriptions**, and **product pages**, in
every language enabled on your store.

Compatible with **all Shopify plans**.

## Prerequisites

* Your store's **myshopify.com domain** (e.g. `your-store.myshopify.com`).
  Semji also accepts the store handle alone (`your-store`) or your admin URL
  (`https://admin.shopify.com/store/your-store`). Your public domain
  (`www.your-store.com`) is **not** accepted.
* Access to your Shopify admin as the **store owner**, or as staff allowed to
  develop apps. Collaborator accounts cannot open the Dev Dashboard.
* An app created for Semji **from your store's own Shopify admin**, see
  [Step 1](#step-1-create-the-semji-app-in-the-dev-dashboard). Shopify only
  lets an app request tokens for stores of its own organization: an app
  created in an agency's or partner's organization cannot be used.
* You are a **workspace owner** in Semji. The connection is shared with the
  whole workspace, and a workspace connects one Shopify store.

<Note>
  Availability of the Shopify integration depends on your Semji plan. If the
  integration does not appear in **Settings → Integrations**, or opens an
  upgrade dialog instead of the connection form, contact your account manager.
</Note>

<Note>
  Since January 1, 2026, Shopify no longer lets you create custom apps
  directly in the Shopify admin, and Semji does not take a static Admin API
  access token (`shpat_…`). Create the app in the Dev Dashboard as described
  below, even if your store still has an older custom app.
</Note>

## Step 1: Create the Semji app in the Dev Dashboard

<Steps>
  <Step title="Open the Dev Dashboard from your store">
    In your Shopify admin, go to **Settings → Apps → Develop apps** and click
    **Build apps in Dev Dashboard**. Shopify documents this path for apps used
    on your own store. The connection requires the app and the store to belong
    to the same Shopify organization.
  </Step>

  <Step title="Create the app">
    In the Dev Dashboard, open **Apps** and click **Create app**. In the
    **Start from Dev Dashboard** section, give it a recognizable name (e.g.
    *Semji*), and click **Create**.
  </Step>

  <Step title="Set the access scopes and release the version">
    On the app's **Versions** page:

    * **Scopes** (in the **Access** section): enter the seven scopes listed
      in [Access scopes for the app](#access-scopes-for-the-app):

      ```text theme={null}
      read_content,write_content,read_products,write_products,read_translations,write_translations,read_locales
      ```
    * **App URL**: Semji does not use it. If the field is empty, enter
      `https://shopify.dev/apps/default-app-home`.
    * **Webhooks API version**: any version (Semji uses no webhooks).

    Click **Release**, then **Release** again to confirm (the version name
    and message are optional). Scopes only apply once the version is
    released.
  </Step>

  <Step title="Install the app on your store">
    Open the app's **Installs** card, click **Install app**, select your
    store, and click **Install**.
  </Step>

  <Step title="Copy the Client ID and the Client secret">
    Open the app's **Settings** and copy the **Client ID** and the **Client
    secret** from the **Credentials** section. Treat the secret like a
    password: share it only through the Semji connection form.
  </Step>
</Steps>

<Note>
  Shopify never displays an Admin API access token for a Dev Dashboard app.
  There is nothing else to copy: Semji requests its own token with the Client
  ID and the Client secret.
</Note>

## Access scopes for the app

Enter all of the following scopes on the app's version:

| Scope | Why Semji needs it | Required |
| - | - | - |
| `read_content` | Read blogs, blog posts and pages | Always |
| `write_content` | Create, update and delete blog posts and pages, including their SEO title and description | Always |
| `read_products` | Read products and collections (Shopify protects collections behind the product scopes) | Always |
| `write_products` | Update the content and SEO fields of products and collections | Always |
| `read_translations` | Read the existing translations of your content | Always |
| `write_translations` | Register translations | Always |
| `read_locales` | Read the languages enabled on your store | Always |

<Warning>
  **All seven scopes are required, even if you plan to disable some tools.**
  Semji checks the scopes granted to the app when you connect and refuses the
  connection if one of them is missing.
</Warning>

<Note>
  **Changing the scopes later:** add them to a new version of the app and
  release it. For a store of your own organization, releasing the version
  approves the change. If the error persists, reinstall the app on
  the store from its **Installs** card, then try again.
</Note>

## Step 2: Connect from Semji

<Steps>
  <Step title="Open the CMS integrations">
    In Semji, go to **Settings → Integrations**, find **Shopify** among the
    **CMS** integrations and click **Enable**. If Semji opens the Shopify
    page first, click **Enable** there.
  </Step>

  <Step title="Enter your store's credentials">
    Fill in the three fields:

    * **Store domain**: your myshopify.com domain, e.g.
      `your-store.myshopify.com` (the handle alone or your admin URL also
      work, your public domain does not).
    * **Client ID**: copied in Step 1.
    * **Client secret**: copied in Step 1.

    Click **Next**. Semji tests the connection live: it requests an access
    token from your store with the Client ID and the Client secret, checks
    the scopes granted to the app, and reads your store's name and primary
    domain. Nothing is written to your store.
  </Step>

  <Step title="Pick the Shopify tools">
    Choose what AI agents can do on your store. Every tool is enabled by
    default; you can disable any of them:

    * **Describe content model**: inspect the languages and writable fields
      of pages, collections and products.
    * **List contents**: browse and search pages, collections and products.
    * **Read content**: retrieve a page, collection or product and its
      content.
    * **Create & update content**: create and update pages and products,
      update collection content.
    * **Delete content**: delete pages (destructive).
    * **Describe blog model**: inspect the blogs, tags, languages and
      writable fields of blog posts.
    * **List blog posts**: browse and search blog posts.
    * **Read blog post**: retrieve a blog post and its content.
    * **Create & update blog posts**: create and update blog posts (drafts
      by default).
    * **Delete blog post**: delete blog posts (destructive).
    * **Register translations**: register the translation of an entry for
      a store language.
  </Step>

  <Step title="Connect">
    Click **Connect**. Semji verifies the credentials one more time, then
    saves the connection. Shopify now shows as **Enabled**.
  </Step>
</Steps>

## What Semji can do once connected

| Content kind | Read | Create | Update | Delete | Translate | Notes |
| - | - | - | - | - | - | - |
| Blog posts | ✓ | ✓ | ✓ | ✓ | ✓ | New posts are created as **drafts** in the blog you choose |
| Pages | ✓ | ✓ | ✓ | ✓ | ✓ | New pages are created as **drafts** |
| Collections | ✓ | ✗ | ✓ | ✗ | ✓ | Description, SEO title and description, title, handle, template suffix |
| Products | ✓ | ✓ | ✓ | ✗ | ✓ | New products are created as **drafts** with their content only: description, SEO title and description, title, handle, template suffix |

A few guarantees built into the connector:

* **Collections are never created or deleted, products are never
  deleted.** A product created by Semji is a **draft** holding its title,
  description, handle and search engine listing only: set its price,
  inventory, variants and sales channels in Shopify before making it
  active.
* **A product's price, inventory, tags and vendor are never written, and its
  status is never changed.**
* **New blog posts and pages are drafts** until you ask an agent to publish
  them, and a published post or page is never switched back to draft.
* **Some edits go live immediately**: any update to an active product, a
  collection, or an already published blog post or page (Shopify keeps no
  draft revision), and any translation in a published language. The CMS
  Publisher agent tells you the change will be visible at once and waits for
  your explicit approval before writing.
* **Updates are partial**: only the fields the agent changes are written,
  everything else keeps its current value.
* **Changing a handle redirects the old URL** to the new one.
* **Deletion is limited to blog posts and pages**, and agents ask for your
  explicit confirmation of the exact entry before deleting it.

### Languages and translations

* Translations are registered **on the original entry**, for one of the
  languages enabled on your store (**Settings → Languages** in Shopify),
  never as a separate copy per language. Semji writes translations through Shopify's Admin API.
* The target language must be **enabled** on your store and cannot be its
  **primary** language.
* A translation in a **published** language is live immediately. In a
  language that is enabled but not published yet, it stays invisible to
  buyers until you publish the language.
* Translatable fields: title, content, excerpt (blog posts), SEO title and
  description, and handle.
* When the original entry changes, Shopify flags its translations as
  outdated; agents see that flag when they read the entry.

## Manage or disconnect

In **Settings → Integrations**, open Shopify:

* **Manage tools**: enable or disable each tool individually.
* **Disable**: removes the connection for the whole workspace. It does not
  uninstall the app from your store: uninstall it from your Shopify admin
  (**Settings → Apps**) if you no longer need it.

The store domain, the Client ID and the Client secret cannot be edited in
Semji. To connect another store or to change the credentials, disable the
integration and connect again (the tool selection is reset).

<Note>
  **Rotating the Client secret:** in the Dev Dashboard, open the app's
  **Settings**, click **Rotate** next to the Client secret and generate a new
  secret. Disable the Shopify integration in Semji and connect again with the
  new secret (choose the tools again: the selection is not kept), then revoke
  the old secret in the Dev Dashboard. Revoking the old secret first breaks
  the connection until you reconnect.
</Note>

## Network and firewalls

Semji only calls Shopify's Admin API on your store's `myshopify.com` domain,
which Shopify hosts. Your storefront's public domain is never called (Semji
only uses it to build links to your content), so a firewall, WAF, or
Cloudflare rule in front of your storefront does not affect the connection,
and there is no IP address to allow.

## Troubleshooting

<AccordionGroup>
  <Accordion title="&#x22;Shopify rejected the credentials. Check the Client ID and Client secret, and that the app is installed on this store (the app and the store must belong to the same Shopify organization).&#x22;">
    Shopify refused to issue an access token. Check, in order:

    1. **The Client ID or the Client secret is wrong**: copy both again from
       the app's **Settings** in the Dev Dashboard. If the secret was
       rotated, use the new one.
    2. **The app is not installed on the store**: open the app's
       **Installs** card in the Dev Dashboard and install it on your store.
    3. **The app belongs to another organization**: an app created in an
       agency's or partner's organization cannot request tokens for your
       store. Create the app from your own Shopify admin (**Settings → Apps
       → Develop apps → Build apps in Dev Dashboard**) as described in
       [Step 1](#step-1-create-the-semji-app-in-the-dev-dashboard).
  </Accordion>

  <Accordion title="&#x22;The app is missing Admin API access scopes. Grant read_content, write_content, read_products, write_products, read_translations, write_translations and read_locales on its version, reinstall it, then try again.&#x22;">
    The app's released version lacks at least one of the seven scopes. Add
    the missing scopes to a new version of the app, release it, and try
    again. If the error persists, reinstall the app on the store from its
    **Installs** card. See [Access scopes for the app](#access-scopes-for-the-app).
  </Accordion>

  <Accordion title="&#x22;Could not connect to the Shopify store. Check the store domain and the app credentials.&#x22;">
    * **The store domain is your public domain** (e.g. `www.your-store.com`):
      enter your `your-store.myshopify.com` domain instead.
    * **The store domain is malformed**: a store handle only contains
      lowercase letters, digits, and dashes.
    * **Shopify returned a temporary error**: wait a minute and try again.
  </Accordion>

  <Accordion title="&#x22;No Shopify store answers on this domain. Check the store domain.&#x22;">
    No store exists with this handle. Check the spelling of your
    `myshopify.com` domain: it can differ from your store's name or public
    domain.
  </Accordion>

  <Accordion title="&#x22;The store is not reachable through its Admin API right now (frozen, locked or behind a security challenge). Check the store status in Shopify and try again.&#x22;">
    Shopify answered that the store cannot serve API requests, for example a
    store frozen for an unpaid bill, or a locked store. Check the store's
    status in your Shopify admin, then try again.
  </Accordion>

  <Accordion title="&#x22;The store cannot be reached. Check the domain and try again.&#x22;">
    The request did not reach Shopify (unknown domain, network error, or
    timeout). Check the store domain and try again a bit later.
  </Accordion>

  <Accordion title="&#x22;This workspace is already connected to a Shopify store. Disconnect the existing integration before creating a new one.&#x22;">
    A workspace connects a single Shopify store. Disable the current Shopify
    integration first, then connect the new store.
  </Accordion>

  <Accordion title="An agent reports a Shopify authentication or permission error">
    If you just reinstalled the app or released a new version, ask the agent
    again: Semji requests a new token after the first refused request.
    Otherwise, the connection worked but Shopify now refuses the requests.
    Frequent causes: the app was uninstalled from the store, its Client secret was
    rotated or revoked, or its scopes changed. Reinstall the app or release
    the missing scopes, and if the secret changed, disable the integration
    and connect again with the new secret.
  </Accordion>

  <Accordion title="An agent reports that a language is not enabled on the store">
    Translations can only target a language enabled on your store. Add the
    language under **Settings → Languages** in your Shopify admin, then ask
    the agent again.
  </Accordion>

  <Accordion title="A product or collection update went live immediately">
    That is Shopify's behavior, not a bug: collections, active products, and
    published blog posts and pages have no draft revision, so every update is
    live on the storefront. For this reason, Semji's CMS Publisher agent warns
    you and asks for your approval before such a write. New blog posts, pages
    and products, in contrast, are created as drafts, and a draft product
    stays hidden until you make it active.
  </Accordion>
</AccordionGroup>

## Related

* [Sync drafts to your CMS](/guides/sync-drafts-to-cms): API-based
  publishing flow, if you prefer to drive the sync yourself.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.