What is a first-party pixel?

Why Ordinary uses a first-party pixel instead of the traditional Meta/Google pixel and what that means for the data quality you see in reports.

Ordinary Written by The Ordinary Team · Updated

What is a first-party pixel?

Short version: a pixel that runs on your Shopify domain and reports to us instead of running on Meta’s / Google’s infrastructure and reporting to them. It’s more reliable, more accurate, and not blocked by ad-blockers or iOS privacy changes.

The problem with traditional pixels

Meta’s pixel, Google’s tag, and most other ad-platform pixels are third-party:

  • They load from connect.facebook.net or googletagmanager.com.
  • The browser treats them as third-party scripts.
  • iOS 14.5+ blocks third-party tracking by default.
  • ~30% of visitors run ad-blockers that block these domains outright.
  • Browser cookies set by these pixels expire after 7-30 days under Safari ITP and similar Firefox/Chrome rules.

Net effect: your Meta pixel sees ~60-80% of your real traffic and under-reports conversions by an equal margin. Most brands have learned to not fully trust their ad-platform numbers.

How a first-party pixel is different

Ordinary’s pixel:

  • Runs via Shopify’s Customer Events extension — loaded by Shopify’s own infrastructure, first-party to your store domain.
  • Not blocked by ad-blockers (the URL is your own shop, not a known tracker).
  • Not subject to iOS 14.5 third-party restrictions.
  • Cookies are first-party, so they persist for the browser’s normal retention period (not the shortened third-party window).

Result: materially more session coverage than a traditional third-party pixel can capture — and a cleaner view of your data since it isn’t subject to platform reporting quirks.

What the pixel captures

  • Page views (generic page URL + referrer + UTM chain)
  • Product views (which SKU was viewed)
  • Collection views
  • Onsite search queries (the term typed into the storefront search bar)
  • Add-to-cart (which SKU + variant, quantity, price)
  • Cart views
  • Checkout started
  • Payment info submitted
  • Checkout completed (with order ID linking back to Shopify)
  • Storefront alerts (out-of-stock messages, payment-declined notices, shipping-rate errors — the kinds of messages that indicate checkout friction)
  • App-extension errors (when a third-party checkout extension fails; helps diagnose app reliability issues affecting your conversions)

Each event is tagged so that repeat visits from the same browser are recognized as part of one journey instead of a string of disconnected sessions.

Bot traffic filtering

Not every event the pixel captures comes from a real shopper. Search engine crawlers (Googlebot, Bingbot), AI scrapers (GPTBot, ClaudeBot, PerplexityBot), SEO tools (AhrefsBot, SemrushBot), social link unfurl previews, uptime monitors, and disguised crawlers all fire pixel events as they browse your store.

Ordinary classifies these as bot traffic and excludes them from session, visitor, and funnel reports — so your headline numbers reflect what real humans actually did. See how bot traffic filtering works for the full picture of what we exclude and why.

What the pixel doesn’t capture

  • Logged-in customer identity unless Shopify’s Customer Events API provides it. When Shopify tells us which customer just placed an order, we link their prior anonymous browsing to their profile. Before that link happens, their activity is tracked anonymously.
  • Activity on other sites — we only see what happens on your store. UTMs tell us where they came from; they don’t let us follow them elsewhere.
  • Offline purchases — in-store POS, phone orders, B2B invoicing. Those hit Shopify’s order webhook but have no pixel session attached.
  • Pre-purchase browsing for shoppers on aggressive privacy browsers who don’t end up buying. A small slice of visitors use browsers (Brave with default shields, Safari with strict tracking protection, iOS content blockers) that block our pixel from running on their device. We pair the pixel with two recovery layers — a first-party beacon path that defeats most cross-origin tracker blocking, and a server-side reconstruction of the conversion event for shoppers who do buy — but pre-purchase browse activity (page views, product views) for blocked-browser shoppers who never complete an order is genuinely uncapturable. We don’t fabricate it.

What we still capture for blocked-browser shoppers who buy

For an order from a shopper whose browser blocked our pixel entirely, we reconstruct the conversion record server-side from Shopify’s order webhook (which is server-to-server and unaffected by browser blocking) and Shopify’s own customer-journey data. So the merchant gets:

  • The order in their reports
  • Accurate revenue attribution
  • Real channel attribution (e.g. “Paid Social”, not the catch-all “Direct” bucket)
  • Proper product / SKU / discount-code attribution

What’s missing for these orders: the pre-purchase funnel (which products were viewed, how long the visitor browsed, etc.) — there’s no server-side equivalent for that data.

How Ordinary compares against Meta’s own numbers

You’ll typically see:

  • Ordinary’s sessions > Meta pixel’s on your store (better coverage).
  • Ordinary’s orders ≈ Shopify’s (we read from Shopify’s webhook, which is authoritative).
  • Ordinary’s ROAS < Meta’s reported ROAS (Meta includes view-through + cross-device stitching that inflates their numbers).

Meta’s reporting is useful for relative campaign performance. Ordinary is useful for absolute revenue truth and first-party attribution.

Checking your Meta CAPI match quality

If you also have the Meta Conversions API connected, the Meta CAPI card on Settings shows an Aggregated Event Measurement (AEM) priority diagnostic. AEM is Meta’s iOS-14+ mechanism that prioritises a small ranked list of conversion events per pixel — mis-prioritised events can silently degrade ad delivery. The diagnostic surfaces:

  • The current ranked list of events Meta is using to optimise your campaigns
  • Whether Purchase is at position 1 (it should be — that’s where the revenue signal lives)
  • Whether the events Ordinary is sending match the ones Meta has prioritised, so you don’t end up paying for impressions on events Meta isn’t actually counting

If anything looks off, the card links to the relevant page in your Meta Events Manager so you can rerank without leaving the context.

What if I still want to run a Meta pixel?

You can. Ordinary’s pixel doesn’t conflict with Meta’s; they’re on different infrastructures. Most brands keep their Meta pixel for the downstream benefit (Meta’s ad optimization uses it) and treat Ordinary as the source of truth for reporting.

Optional: CNAME first-party forwarding (recover the last ~3-4%)

Even with our Shopify Customer Events pixel, the events your visitors fire have to POST to somewhere. By default that destination is app.tryordinary.com — which the browser treats as a third-party domain relative to your storefront. Safari ITP, Brave Shields, uBlock Origin, and aggressive content-blockers strip or drop those POSTs.

You can close that gap by configuring CNAME forwarding in Settings → First-Party Pixel. We give you a hostname like i.<your-domain>.com that points at Ordinary. Once you add the CNAME record at your DNS provider and we verify the record is live, your storefront pixel POSTs events to your own subdomain. The browser sees same-site requests and stops blocking them.

Setup is a single CNAME record at your DNS host:

Type:   CNAME
Name:   i
Value:  <the target shown in your Settings → First-Party Pixel card>
TTL:    3600

(Use whatever subdomain you prefer — i is the convention; track or pixel also work as long as you control that subdomain.)

We auto-provision a TLS certificate within ~30 seconds of DNS propagating. Status updates live in the Settings card. You can revoke at any time and the pixel falls back to the standard app.tryordinary.com route — no broken state in between.

What’s identical with vs without forwarding: the data we collect, how long we keep it, who processes it, our role as your data processor. Only the network route changes — events flow your-storefront → your-cname-subdomain → Ordinary instead of your-storefront → Ordinary directly. From your end-customers’ perspective there’s nothing visibly different.

What you get with it: closer to ~99% session capture in environments where ad-blockers / Safari ITP / Brave Shields would otherwise drop the third-party POST. Most useful for brands with high iOS / Brave / privacy-focused-browser traffic shares.

What if your storefront is *.myshopify.com only (no custom domain)? You can’t add a CNAME under myshopify.com (Shopify owns that zone). Skip CNAME forwarding for now — it’s only useful once you bring your own domain.

Did this answer your question?

Thanks for your feedback! 🙌

Related articles