Skip to main content

Shopify Integration

Privacy-first, cookieless analytics for Shopify stores. Sealmetrics tracks the e-commerce funnel in the browser and confirms purchases server-side through a Shopify webhook.

How it works​

How the browser side is tracked depends on how your store installed Sealmetrics:

Public appCustom app
InstalledFrom the Sealmetrics dashboard (Shopify App Store app)With an install link we send you (one app made for your store)
Browser trackingThe "Sealmetrics Analytics" app embed, a Theme App Extension you enable in your themeA Shopify Web Pixel, activated automatically when the app is installed
Setup after installEnable the app embed and paste your Account IDNone
BillingShopify Managed PricingSealmetrics (Stripe)

Both share the rest:

  • The app handles the connection (OAuth) and registers the orders/create conversion webhook.
  • Purchases are recorded from that webhook, server-side, with revenue, currency and line items.

No shopper-facing UI is rendered. Sealmetrics is invisible by design (privacy-first).

Requirements​

  • A Sealmetrics account (your Account ID — the same value as your Site ID — identifies the site you want to track).
  • Public app: a Shopify store on a plan that allows app embeds.

Connect your store​

Public app: from the dashboard​

Connection is managed from Settings → Integrations → Shopify in the Sealmetrics dashboard.

  1. Open Settings → Integrations → Shopify.
  2. Select the site you want to connect.
  3. Enter your Shopify domain (the mystore part of mystore.myshopify.com) and click Connect Shopify.
  4. You are redirected to Shopify to install and authorize the app.

Once installed, the store appears as Connected, showing the store domain and the connection date, and the conversion webhook is registered automatically. Then activate the app embed.

We send you a Shopify install link for your store (links expire after 7 days; ask for a new one if yours has). Open it, approve the app in Shopify, and you are done: the conversion webhook and the Web Pixel are set up during the install. The store then appears as Connected in Settings → Integrations → Shopify.

Disconnecting​

How you disconnect depends on how the store was installed:

  • Public-app stores (billed through Shopify): to disconnect and stop billing, uninstall Sealmetrics from your Shopify Admin → Settings → Apps. The dashboard does not expose a Disconnect button for these stores, to keep the Shopify subscription and your Sealmetrics account in sync.
  • Custom-app stores (billed through Sealmetrics): a Disconnect button is available in the dashboard. Disconnecting disables Shopify conversion tracking; you can reconnect later.

Activate the tracker (public app)​

Connecting the public app does not start front-end tracking on its own. You must enable the app embed and provide your Account ID.

  1. In the Sealmetrics dashboard (the connected Shopify card), copy your Account ID. Use the Copy button next to it.
  2. In Shopify, open the theme editor and go to Theme → App embeds.
  3. Enable the Sealmetrics Analytics embed. (The dashboard provides an Activate the embed button that deep-links to the theme editor.)
  4. Paste your Account ID into the embed's Sealmetrics Account ID field and Save.

The embed loads the Sealmetrics loader by account:

<script async src="https://t.sealmetrics.com/shopify-loader.js?account=YOUR_ACCOUNT_ID"></script>

The loader then injects the tracker (t.js), writes Sealmetrics session attributes to the Shopify cart, and sets up the microconversion listeners described below.

The Web Pixel (custom app)​

On custom-app stores the browser side runs as a Shopify Web Pixel, Shopify's own sandbox for analytics code. It is created during the install with your Account ID already set, so there is no theme edit, no app embed and no field to fill in.

You can see it in Shopify Admin → Settings → Customer events, listed under app pixels.

The Web Pixel listens to Shopify's standard customer events instead of reading the theme, so it keeps working on customized themes and inside Shopify's checkout. It does not send page views for checkout, thank-you or order-status pages.

Custom apps connected before October 2026

Custom-app stores connected before October 2026 load the same loader as the app embed, through a Shopify ScriptTag. Their events are the ones described for the app embed below.

E-commerce events​

Sealmetrics tracks the following events automatically once the browser tracking is active and the conversion webhook is registered.

EventTypeApp embed (public app)Web Pixel (custom app)Properties
pageviewAutoTracker (t.js)Shopify page_viewed (not on checkout pages)Standard pageview
view_productMicroconversionLoader, on /products/{handle} pagesShopify product_viewedproduct_id, product_name, sku, price, currency
add_to_cartMicroconversionLoader, intercepts /cart/addShopify product_added_to_cartproduct_id, product_name, sku, price, quantity, currency
initiate_checkoutMicroconversionLoader, checkout submit/click and /checkout requestsShopify checkout_startedcart_url (app embed only)
purchaseConversionShopify orders/create webhook (server-side)Samerevenue, currency, items array

view_product​

  • App embed: fired on product pages (/products/{handle}). The loader reads product data from JSON-LD (@type: "Product") and falls back to ShopifyAnalytics.meta for the product ID. It also re-fires on SPA navigation between products.
  • Web Pixel: fired on Shopify's product_viewed event, with the data of the variant being viewed.

add_to_cart​

  • App embed: the loader intercepts fetch and XHR calls to /cart/add and emits one add_to_cart per line item, with the price normalized from cents to a decimal value.
  • Web Pixel: fired on Shopify's product_added_to_cart event, with the added line's variant and quantity.

initiate_checkout​

  • App embed: fired (once per checkout attempt) when the shopper submits the cart form, clicks a checkout link/button, a Shopify dynamic checkout (Buy Now) button, or when a /checkout request is detected. A dedup flag prevents duplicate events; it resets on SPA navigation.
  • Web Pixel: fired on Shopify's checkout_started event. It carries no cart_url, because inside checkout the URL contains the checkout token.

purchase​

Purchases are confirmed server-side, not from the browser. When an order is placed, Shopify sends an orders/create webhook to Sealmetrics, which records the conversion with its revenue, currency, and line items. To make this reliable, the app requests the read_orders scope and registers the orders/create webhook on install.

To attribute the order to the visit (channel, campaign, landing page), Sealmetrics needs to know which visit it came from:

  • App embed: the loader writes Sealmetrics session attributes to the cart, and the order carries them.
  • Web Pixel: a Web Pixel cannot write cart attributes. Instead, the initiate_checkout event links the checkout to the visit, and the order is matched to that link when it arrives. The link only counts for the account of the store that sends the order, and expires after 24 hours.
note

The order ID is not stored externally, consistent with Sealmetrics' privacy-first policy.

Billing​

Billing depends on how the store installed Sealmetrics:

  • Public-app stores are billed through Shopify Managed Pricing. After approving a plan in Shopify Admin, the dashboard shows a Shopify billing card to manage the plan. To stop billing, uninstall the app from Shopify Admin.
  • Custom-app stores are billed on Sealmetrics directly. The Shopify page shows a note pointing to Settings → Billing, where the plan is managed.

Plans and prices are presented through Shopify's Managed Pricing flow in Shopify Admin. Check the current options there rather than relying on a fixed figure.

Privacy and compliance​

  • No cookies are used; tracking is cookieless by design. The Web Pixel does not use browser storage either.
  • Order IDs are not stored externally.
  • The public app subscribes to Shopify's mandatory GDPR/compliance webhooks:
    • customers/data_request
    • customers/redact
    • shop/redact

Troubleshooting​

Tracker not loading​

Public app:

  1. Confirm the Sealmetrics Analytics app embed is enabled in Theme → App embeds.
  2. Confirm your Account ID is pasted into the embed field and saved (the embed does nothing if it is blank).
  3. Check the browser console for the shopify-loader.js request and any JavaScript errors.

Custom app:

  1. Open Shopify Admin → Settings → Customer events and confirm the Sealmetrics pixel is listed under app pixels and connected.
  2. Web Pixels run in a sandbox, so they do not appear in the page's console. Use Shopify's Pixel Helper to see the events it sends.
  3. If the pixel is missing, contact support@sealmetrics.com.

Purchases not tracking​

  1. Confirm the store shows Connected in Settings → Integrations → Shopify (this means the conversion webhook is registered).
  2. Place a test order and verify it appears as a conversion.
  3. Public app: if you recently reinstalled or changed scopes, reconnect from the dashboard so the orders/create webhook is re-registered. Custom app: contact support@sealmetrics.com.

Orders or revenue don't match Shopify​

This is the most common Shopify support question, and the usual advice does not apply here.

Purchases are not counted by the pixel

On Shopify, purchase conversions come from the orders/create webhook, server-side. They do not depend on the tracker firing on a thank-you page. So the two causes behind most reconciliation issues elsewhere — the conversion pixel not firing, and the base pixel firing too late — cannot be the explanation on a Shopify store. Auditing the checkout for pixel problems will not find anything.

Work through these instead:

  1. Confirm the webhook is live. The store must show Connected in Settings → Integrations → Shopify. If you reinstalled the app or changed scopes, reconnect from the dashboard so orders/create is re-registered. Orders placed while the webhook was not registered are not backfilled.
  2. Check what your Shopify number actually includes. Shopify's own reports can cover orders from channels and states that may not be part of what you are comparing: point of sale, draft orders created in the admin, marketplace or social channels, and orders that were cancelled, refunded, or never paid. Compare like with like before concluding anything is missing.
  3. Compare the same window in the same timezone. Sealmetrics rolls the day in the account timezone (Settings → Account); Shopify rolls it in the store timezone. If they differ, totals shift around the day boundary.
  4. Check the currency. If your store sells in several currencies, confirm which one the figure you are comparing is expressed in.
  5. Place a test order and follow it. Put a real order through the same flow your customers use, note the exact time and amount, and check whether it appears in Sealmetrics. This separates "the integration is not receiving orders" from "the two numbers count different things" faster than anything else.

If a test order does not show up, contact support@sealmetrics.com with its date, time, and amount, and we will trace the webhook delivery.

Microconversions missing​

  1. view_product only fires on product pages — confirm you are testing a product page.
  2. App embed: add_to_cart relies on standard /cart/add requests; heavily customized themes that bypass the standard cart endpoints may not be detected. The Web Pixel does not have this limit, because it listens to Shopify's own events.
  3. App embed: verify no JavaScript errors in the browser console interrupt the loader.
Written and maintained by the Sealmetrics Team