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 app | Custom app | |
|---|---|---|
| Installed | From the Sealmetrics dashboard (Shopify App Store app) | With an install link we send you (one app made for your store) |
| Browser tracking | The "Sealmetrics Analytics" app embed, a Theme App Extension you enable in your theme | A Shopify Web Pixel, activated automatically when the app is installed |
| Setup after install | Enable the app embed and paste your Account ID | None |
| Billing | Shopify Managed Pricing | Sealmetrics (Stripe) |
Both share the rest:
- The app handles the connection (OAuth) and registers the
orders/createconversion 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.
- Open Settings → Integrations → Shopify.
- Select the site you want to connect.
- Enter your Shopify domain (the
mystorepart ofmystore.myshopify.com) and click Connect Shopify. - 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.
Custom app: from the install link
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.
- In the Sealmetrics dashboard (the connected Shopify card), copy your Account ID. Use the Copy button next to it.
- In Shopify, open the theme editor and go to Theme → App embeds.
- Enable the Sealmetrics Analytics embed. (The dashboard provides an Activate the embed button that deep-links to the theme editor.)
- 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-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.
| Event | Type | App embed (public app) | Web Pixel (custom app) | Properties |
|---|---|---|---|---|
pageview | Auto | Tracker (t.js) | Shopify page_viewed (not on checkout pages) | Standard pageview |
view_product | Microconversion | Loader, on /products/{handle} pages | Shopify product_viewed | product_id, product_name, sku, price, currency |
add_to_cart | Microconversion | Loader, intercepts /cart/add | Shopify product_added_to_cart | product_id, product_name, sku, price, quantity, currency |
initiate_checkout | Microconversion | Loader, checkout submit/click and /checkout requests | Shopify checkout_started | cart_url (app embed only) |
purchase | Conversion | Shopify orders/create webhook (server-side) | Same | revenue, 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 toShopifyAnalytics.metafor the product ID. It also re-fires on SPA navigation between products. - Web Pixel: fired on Shopify's
product_viewedevent, with the data of the variant being viewed.
add_to_cart
- App embed: the loader intercepts
fetchandXHRcalls to/cart/addand emits oneadd_to_cartper line item, with the price normalized from cents to a decimal value. - Web Pixel: fired on Shopify's
product_added_to_cartevent, 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
/checkoutrequest is detected. A dedup flag prevents duplicate events; it resets on SPA navigation. - Web Pixel: fired on Shopify's
checkout_startedevent. It carries nocart_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_checkoutevent 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.
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_requestcustomers/redactshop/redact
Troubleshooting
Tracker not loading
Public app:
- Confirm the Sealmetrics Analytics app embed is enabled in Theme → App embeds.
- Confirm your Account ID is pasted into the embed field and saved (the embed does nothing if it is blank).
- Check the browser console for the
shopify-loader.jsrequest and any JavaScript errors.
Custom app:
- Open Shopify Admin → Settings → Customer events and confirm the Sealmetrics pixel is listed under app pixels and connected.
- 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.
- If the pixel is missing, contact support@sealmetrics.com.
Purchases not tracking
- Confirm the store shows Connected in Settings → Integrations → Shopify (this means the conversion webhook is registered).
- Place a test order and verify it appears as a conversion.
- Public app: if you recently reinstalled or changed scopes, reconnect from the dashboard so the
orders/createwebhook 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.
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:
- 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/createis re-registered. Orders placed while the webhook was not registered are not backfilled. - 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.
- 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.
- Check the currency. If your store sells in several currencies, confirm which one the figure you are comparing is expressed in.
- 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
view_productonly fires on product pages — confirm you are testing a product page.- App embed:
add_to_cartrelies on standard/cart/addrequests; 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. - App embed: verify no JavaScript errors in the browser console interrupt the loader.
Related documentation
- Installation — how the Sealmetrics tracker (
t.js) that the app embed loads works under the hood. - E-commerce Conversion Tracking — the funnel-event model behind the microconversions and purchase webhook.
- WooCommerce — the equivalent integration for WordPress + WooCommerce stores.
- BigCommerce — another hosted-store platform integration.
- Integrations Overview — browse every platform Sealmetrics supports.