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

# Shopify Webhook Setup Guide

> Configure Shopify to deliver events to StackOne.

## Prerequisites

Before continuing, you should have already completed the following for this connector:

<Steps>
  <Step title="Configure the Connector">
    Enable the connector and set up its connector profile in your project. See <a href="/guides/explore-connectors">Managing Connectors</a>.

    <Columns cols={2}>
      <Card title="Connector Profile" href="/connectors/shopify/guides/connector-profile/oauth-2-0" icon="https://stackone-logos.com/api/shopify/filled/svg" horizontal>
        Shopify - OAuth 2.0
      </Card>
    </Columns>
  </Step>

  <Step title="Link an Account">
    Connect an account using <a href="/guides/embedding-stackone-hub">StackOne Hub</a> or <a href="/guides/auth-link">Auth Link</a>.

    <Columns cols={2}>
      <Card title="Link Account" href="/connectors/shopify/guides/link-account/oauth-2-0" icon="https://stackone-logos.com/api/shopify/filled/svg" horizontal>
        Shopify - OAuth 2.0
      </Card>
    </Columns>
  </Step>
</Steps>

<section data-guide-section data-guide-scopes="">
  <h2>How Shopify webhooks reach StackOne</h2>

  <p>StackOne manages the Shopify webhook subscriptions for you. When you subscribe to events in StackOne Hub, StackOne registers the matching webhook subscriptions in Shopify automatically through the Shopify Admin API, and removes them when the account is disconnected. There is no manual webhook setup to do in the Shopify Admin for the standard flow.</p>

  <Steps>
    <Step title="Let StackOne register the subscriptions automatically">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>For a connected Shopify account, no action is needed in the Shopify Admin. StackOne creates one webhook subscription per event you enable in StackOne Hub and points it at its own receiver, then deletes those subscriptions when the account is disconnected.</p>
      </div>
    </Step>

    <Step title="Set the Shop Name so events match the right store">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Inbound events are matched to your connection by the store's myshopify.com domain, which Shopify sends in the `X-Shopify-Shop-Domain` header. Make sure the <strong>Shop Name</strong> on the connection matches that store so deliveries are routed to the correct linked account.</p>

        <ul>
          <li>Format: `my-store` (the subdomain only, taken from `https://{shop-name}.myshopify.com`)</li>
          <li>Example: `acme-store` for the store `acme-store.myshopify.com`</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Register the webhook manually (optional fallback)</h2>

  <p>Use this only if you need to register a subscription outside of StackOne — for example, to pre-register one before connecting. The standard flow above does not require any of these steps.</p>

  <Steps>
    <Step title="Open the Webhooks settings">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In the Shopify Admin, open <a href="https://admin.shopify.com/settings" target="_blank" rel="noopener noreferrer">Settings</a>, select <strong>Notifications</strong>, then click <strong>Webhooks</strong> ("Send XML or JSON notifications about store events to a URL").</p>

        <img src="https://mintcdn.com/stackone-60/tm56drJvSO40LFXU/connectors/shopify/images/events-webhooks-settings.png?fit=max&auto=format&n=tm56drJvSO40LFXU&q=85&s=c3d238406e102b244895237a6d4176ae" alt="The Notifications settings page with the Webhooks entry highlighted." width="1280" height="800" data-path="connectors/shopify/images/events-webhooks-settings.png" />
      </div>
    </Step>

    <Step title="Create a webhook">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>On the <strong>Webhooks</strong> page, click <strong>Create webhook</strong> to open the subscription dialog.</p>

        <ul>
          <li>Note the signing secret shown under <strong>Your webhooks will be signed with</strong> on this page — Shopify uses it to sign each delivery so its authenticity can be verified.</li>
        </ul>

        <img src="https://mintcdn.com/stackone-60/tm56drJvSO40LFXU/connectors/shopify/images/events-create-webhook.png?fit=max&auto=format&n=tm56drJvSO40LFXU&q=85&s=f0c49a82dcf4f805cd39441fea1bbb1e" alt="The Webhooks page with the Create webhook button highlighted and the signing secret below it." width="1280" height="800" data-path="connectors/shopify/images/events-create-webhook.png" />
      </div>
    </Step>

    <Step title="Enter the event and Native Webhook URL">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In the <strong>Add webhook</strong> dialog, choose the store event under <strong>Event</strong>, leave <strong>Format</strong> as <strong>JSON</strong>, and paste the read-only <strong>Native Webhook URL</strong> (copied from the Linked account) into the <strong>URL</strong> field.</p>

        <ul>
          <li>Repeat this for each event you want delivered — Shopify creates one subscription per event.</li>
        </ul>

        <img src="https://mintcdn.com/stackone-60/tm56drJvSO40LFXU/connectors/shopify/images/events-add-webhook-url.png?fit=max&auto=format&n=tm56drJvSO40LFXU&q=85&s=bc890c65e97436ae02a7e781bf0a1e83" alt="The Add webhook dialog with the Event selector and the URL field highlighted." width="1280" height="800" data-path="connectors/shopify/images/events-add-webhook-url.png" />
      </div>
    </Step>

    <Step title="Save the webhook subscription">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Save</strong>. The new subscription appears in the list showing the event and the destination URL, confirming Shopify will now deliver that event to StackOne.</p>

        <img src="https://mintcdn.com/stackone-60/tm56drJvSO40LFXU/connectors/shopify/images/events-webhook-created.png?fit=max&auto=format&n=tm56drJvSO40LFXU&q=85&s=c29b5e0cba4fcd4fc227e20cd4ea1129" alt="The Webhooks page listing the newly created Order creation subscription." width="1280" height="800" data-path="connectors/shopify/images/events-webhook-created.png" />
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Available webhook events</h2>

  <p>The following Shopify events can be enabled. Only events selected in StackOne are delivered — Shopify will not send events you have not subscribed to.</p>

  <Steps>
    <Step title="Order events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to orders and their fulfillment and payment status.</p>

        <ul>
          <li><strong>Order Created</strong> (`orders/create`) — Fired when a new order is created in Shopify</li>
          <li><strong>Order Updated</strong> (`orders/updated`) — Fired when an order is updated in Shopify</li>
          <li><strong>Order Deleted</strong> (`orders/delete`) — Fired when an order is deleted in Shopify</li>
          <li><strong>Order Paid</strong> (`orders/paid`) — Fired when an order is fully paid in Shopify</li>
          <li><strong>Order Cancelled</strong> (`orders/cancelled`) — Fired when an order is cancelled in Shopify</li>
          <li><strong>Order Fulfilled</strong> (`orders/fulfilled`) — Fired when an order is fully fulfilled in Shopify</li>
          <li><strong>Order Partially Fulfilled</strong> (`orders/partially_fulfilled`) — Fired when an order is partially fulfilled in Shopify</li>
        </ul>
      </div>
    </Step>

    <Step title="Product events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to the product catalog.</p>

        <ul>
          <li><strong>Product Created</strong> (`products/create`) — Fired when a new product is created in Shopify</li>
          <li><strong>Product Updated</strong> (`products/update`) — Fired when a product is updated in Shopify</li>
          <li><strong>Product Deleted</strong> (`products/delete`) — Fired when a product is deleted in Shopify</li>
        </ul>
      </div>
    </Step>

    <Step title="Customer events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to customer records.</p>

        <ul>
          <li><strong>Customer Created</strong> (`customers/create`) — Fired when a new customer is created in Shopify</li>
          <li><strong>Customer Updated</strong> (`customers/update`) — Fired when a customer is updated in Shopify</li>
          <li><strong>Customer Deleted</strong> (`customers/delete`) — Fired when a customer is deleted in Shopify</li>
        </ul>
      </div>
    </Step>

    <Step title="Fulfillment events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to fulfillments on orders.</p>

        <ul>
          <li><strong>Fulfillment Created</strong> (`fulfillments/create`) — Fired when a new fulfillment is created in Shopify</li>
          <li><strong>Fulfillment Updated</strong> (`fulfillments/update`) — Fired when a fulfillment is updated in Shopify</li>
        </ul>
      </div>
    </Step>

    <Step title="Inventory events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to inventory levels and inventory items across locations.</p>

        <ul>
          <li><strong>Inventory Level Updated</strong> (`inventory_levels/update`) — Fired when an inventory level changes in Shopify</li>
          <li><strong>Inventory Level Connected</strong> (`inventory_levels/connect`) — Fired when an inventory item is connected to a location in Shopify</li>
          <li><strong>Inventory Item Updated</strong> (`inventory_items/update`) — Fired when an inventory item is updated in Shopify</li>
        </ul>
      </div>
    </Step>

    <Step title="Refund events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to refunds on orders.</p>

        <ul>
          <li><strong>Refund Created</strong> (`refunds/create`) — Fired when a refund is created in Shopify</li>
        </ul>
      </div>
    </Step>

    <Step title="Checkout events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to checkouts, including abandoned checkouts.</p>

        <ul>
          <li><strong>Checkout Created</strong> (`checkouts/create`) — Fired when a checkout is created in Shopify</li>
          <li><strong>Checkout Updated</strong> (`checkouts/update`) — Fired when a checkout is updated in Shopify</li>
        </ul>
      </div>
    </Step>

    <Step title="App lifecycle events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events about the StackOne app's own installation. Enabling <strong>App Uninstalled</strong> is recommended so StackOne can react when the app is removed from the store.</p>

        <ul>
          <li><strong>App Uninstalled</strong> (`app/uninstalled`) — Fired when the merchant uninstalls the app from their Shopify store</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Delivery format</h2>

  <p>Details of how Shopify delivers events to StackOne.</p>

  <Steps>
    <Step title="One event per delivery">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Shopify sends a separate HTTP request for each event — deliveries are not batched. The request body is the JSON of the changed resource (for example the full order for `orders/create`), while delete events carry only the resource id. StackOne routes each delivery to the matching event handler.</p>
      </div>
    </Step>

    <Step title="Identifying headers">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Each delivery includes headers StackOne relies on:</p>

        <ul>
          <li>`X-Shopify-Topic` — the event topic (for example `orders/create`), used to route the delivery to the right handler.</li>
          <li>`X-Shopify-Shop-Domain` — the store's myshopify.com domain, used to match the delivery to the correct linked account.</li>
          <li>`X-Shopify-Webhook-Id` — a unique id per delivery, used for de-duplication.</li>
          <li>`X-Shopify-Hmac-Sha256` — the HMAC-SHA256 signature Shopify sends so the payload's authenticity can be verified.</li>
        </ul>
      </div>
    </Step>

    <Step title="Retries and ordering">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Delivery is at-least-once: if StackOne cannot be reached, Shopify retries the delivery over roughly 48 hours before giving up. Because bulk changes (such as a stock update affecting several locations) emit one event per affected inventory level, expect multiple separate deliveries for a single bulk action.</p>
      </div>
    </Step>
  </Steps>
</section>

## Verify

Your Connector should now be able to receive and process events. Try triggering an event and you should see an Event appear in the Connector logs.
