Customer Events pixel extension

How Ordinary's Shopify Customer Events pixel works, where it runs, and how to verify it's firing on your storefront.

Ordinary Written by The Ordinary Team · Updated

Customer Events pixel extension

Ordinary ships a Shopify Customer Events Web Pixel Extension — a small first-party script that Shopify loads into your storefront on every pageview, cart update, and checkout step.

This is the data source for almost everything in Ordinary: attribution, funnel, sessions, customer behavior.

What it is

Shopify’s Customer Events system is a privacy-compliant, sandboxed way to run tracking scripts. Instead of pasting JavaScript into your theme, pixel extensions are:

  • Installed by the app — no copy-paste. Appears in Shopify admin → Settings → Customer Events as “Ordinary”.
  • First-party — events come from your store’s domain, not a third-party script. Survives ad blockers and iOS privacy rules.
  • Sandboxed — can’t read arbitrary page content or interfere with your theme. Shopify runs pixels in an isolated iframe context.

What events it captures

Ordinary subscribes to all 15 of Shopify’s standard Customer Events:

Browse & discovery

  • page_viewed — every page load. Ties session start to landing URL, referrer, and UTM params.
  • product_viewed — product detail page views.
  • collection_viewed — collection page views.
  • search_submitted — onsite search queries (which queries lead to ATCs / conversions vs. zero-result queries).

Cart

  • cart_viewed — cart page views (distinct from add-to-cart events; lets us split cart-page-revisit volume from net cart-add volume).
  • product_added_to_cart — add-to-cart activity.
  • product_removed_from_cart — items removed from cart before checkout (a real cart-decay signal).

Checkout (each step its own event)

  • checkout_started — buyer reached the checkout page (the classic abandoned-cart boundary).
  • checkout_contact_info_submitted — buyer entered email/phone.
  • checkout_address_info_submitted — buyer entered shipping address.
  • checkout_shipping_info_submitted — buyer selected a shipping method.
  • payment_info_submitted — buyer entered payment details (the last step before confirmation).
  • checkout_completed — order confirmation.

Storefront diagnostics

  • alert_displayed — UX alerts the storefront showed the buyer (shipping-rate unavailable, item out-of-stock at checkout, discount-code-not-applicable, etc).
  • ui_extension_errored — checkout/cart UI extensions that crashed mid-session (silently degraded conversion otherwise).

Each event carries: an anonymous browser identifier, the session ID, the referrer, UTM parameters, and the full payload Shopify exposes for that event type — including line-item composition, cart attributes, applied discount codes, shipping address, marketing-consent state, and so on, where the event provides them. Capturing the full payload means Ordinary can answer questions about the storefront experience that shallower pixel implementations cannot.

How we install it

The extension is deployed automatically and activated when you install Ordinary — no copy-paste, no merchant action needed.

Verifying it’s firing

  1. Open your Shopify admin.
  2. Settings → Customer Events.
  3. Under App pixels, find “Ordinary”.
  4. Status should show Connected.

If it says Disconnected, see Pixel says “Disconnected”.

Live event check

  1. In Ordinary: Settings → Integrations → Shopify.
  2. Below the connection card, look for Pixel events (last 5 min).
  3. Visit your storefront in a new tab and click a product.
  4. Refresh the Settings page — the counter should tick up.

If events don’t appear within ~30 seconds of activity on the storefront, your pixel is not firing. See Pixel says “Disconnected”.

If you see two Ordinary pixels

If your store shows two Ordinary pixels:

  • Ordinary app pixel (listed under App pixels) — Keep Connected.
  • Any other Ordinary-labeled pixel (listed under Custom pixels, not App) — Disable.

Both firing at once will double-count events. The app pixel always wins.

Data flow

Events flow from the shopper’s browser through Shopify’s Web Pixel runtime to Ordinary, then into attribution / funnel / session reports.

Typical latency from event to Ordinary UI is 10-30 seconds.

What “pixel coverage” actually means

Ordinary tracks how many of your storefront orders have a matching pixel session, and surfaces this as your pixel coverage health. You don’t need to do anything with it — it’s a quick way to confirm the pixel is firing across your storefront traffic.

Two important things this metric ISN’T:

  1. Not “did the visit have UTM params”. Most storefront sessions are direct, organic, or returning customers — they have no UTMs, and that’s normal. A 0% UTM-tagged-orders org is NOT a 0% pixel-coverage org.
  2. Not “every channel uses the pixel”. POS sales, admin-created draft orders, headless Storefront API orders, and third-party app orders bypass the storefront pixel by design. The page filters those out of the denominator and shows them in a separate “Non-web” column so the channel mix is visible without polluting the pixel-health metric.

So a healthy merchant who sells 80% on the storefront and 20% via POS will show ~95-100% pixel coverage (the storefront fraction) and the 20% POS share visible separately as “Non-web”.

Privacy

  • We don’t collect PII (names, emails, phone numbers) through the pixel. PII comes from Shopify webhooks post-checkout.
  • Events are stored anonymously keyed by an opaque browser identifier.
  • Customer consent is respected — if Shopify’s Customer Privacy API indicates the visitor has declined analytics, the pixel emits no events.

Did this answer your question?

Thanks for your feedback! 🙌

Related articles