# 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.

Source: https://help.tryordinary.com/integrations/customer-events-pixel

---

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"](https://help.tryordinary.com/troubleshooting/pixel-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"](https://help.tryordinary.com/troubleshooting/pixel-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.

## Related articles

- [What is a first-party pixel?](https://help.tryordinary.com/concepts/first-party-pixel)
- [Pixel says "Disconnected"](https://help.tryordinary.com/troubleshooting/pixel-disconnected)
- [Shopify — the base integration](https://help.tryordinary.com/integrations/shopify)
