Shopify’s Native CAPI vs Elevar vs Custom: Who Needs the App?
Every existing comparison is written by someone selling one of the columns. Here's the segmented answer with the incentives removed: most stores should stay on the free native route — and the ones who shouldn't can name the exact reason.

The vendor-free segmentation: under ~$50k/mo ad spend with a standard checkout → stay on Shopify's free native integration (real CAPI, automatic dedup, genuinely fine). Elevar-class apps ($100–350/mo) earn it at $50k+/mo, on subscription/upsell stacks the native black box misreports, or when you need per-parameter visibility and alerting. Custom builds are for headless/multi-region stacks with real dev capacity — never a cost-saving move. Architectural constant on all three: Shopify's Web Pixels sandbox races the buyer's exit, so Purchase must be webhook-driven server-side with the browser event deduplicated against it. Grade any route on two numbers: dedup rate 90%+ and Purchase parity with Shopify admin within ~5%.
• The uncomfortable, vendor-free answer: most Shopify stores under ~$50k/mo with a standard checkout should stay on the free native integration — it sends CAPI with automatic dedup and is genuinely fine. • Apps like Elevar earn their $100–350/mo at scale, on subscription/upsell stacks, or whenever you need per-parameter visibility instead of a black box. • The technical reason browser tracking under-counts on Shopify: Web Pixels run sandboxed and race the buyer's exit on the checkout — the server webhook, not the browser, must own Purchase. • Judge ANY route by two numbers in Events Manager: dedup rate above 90% and Purchase parity with the Shopify admin within ~5%. • Custom builds trade a subscription for maintenance forever — right answer for headless and multi-region stacks, wrong answer as a cost-saving move. • Switching routes? Run both for a week with distinct test events, then cut over — never let two full pipelines report the same Purchase without a shared event_id.
Why this comparison doesn't exist anywhere neutral
Search this question and the results are the app vendors' own blogs (conclusion: buy the app), agency posts monetizing the setup service (conclusion: hire us), and Reddit threads where all three camps shout past each other. Nobody with a stake writes the boring truth: the right answer is segmented by store size and stack, and for the majority segment the right answer is free. Clikim sells ad accounts, not tracking apps — we don't care which route you pick, only that your signal is clean enough to spend against. So here's the comparison with the incentives removed.
What the native integration actually does (and hides)
Shopify's official Facebook & Instagram app wires your store to Meta with browser events plus Conversions API server events, deduplicated automatically. For a standard checkout it is genuinely good: purchases flow from Shopify's own order system — the same source of truth your accountant uses — with checkout emails as match keys. The catch is the word you'll hit the first time something looks off: black box. You cannot see which parameters it sends, filter events, enrich payloads, or fix its choices; when Meta and Shopify disagree, your debugging surface is Events Manager and hope. Stores with subscription apps (Recharge and friends) hit this wall hardest — renewal orders and upsell flows routinely misreport through the native path, and there is no knob to turn.
The Web Pixels sandbox race (the part everyone skips)
Since Checkout Extensibility, third-party scripts on Shopify's checkout run inside a sandboxed Web Pixels environment — an isolated context that loads alongside the page rather than in it. That sandbox creates a race condition: the pixel script initializes while the buyer is already moving, and a fast buyer on a slow connection can finish checkout and close the tab before the browser Purchase ever fires. Browser-only Shopify setups silently drop purchases this way — commonly around a tenth of them, worse on mobile. This is the single most important architectural fact in the whole comparison, because it means the question is never "browser or server?" — Purchase must be webhook-driven server-side on every route, with the browser event as the deduplicated companion, not the source of truth. All three routes can do this; they differ in whether you can verify it.
The three routes, side by side
The columns don't compete on quality — they compete on visibility. Native is fine until the day you need to see inside it.

Each route wins somewhere — the mistake is paying for control you won't use, or needing control you didn't buy.
Who actually needs the app
The honest segmentation, with no affiliate link in sight: Stay native if you're under roughly $50k/mo in ad spend with a standard checkout and your Events Manager shows healthy dedup — the app subscription would buy you visibility you'd never open. Buy an Elevar-class app (Elevar is the category namer; several competitors play the same position) when the numbers make signal loss expensive: $50k+/mo spend where a few misattributed percent outprices the subscription, subscription/upsell stacks the native path misreports, thin-margin stores that need verifiable dedup rather than trusted dedup, or any operation where "we can't see what it sends" is an unacceptable audit answer. Build custom only when the stack forces it — headless storefronts, multi-region multi-pixel routing, data-residency constraints — or when in-house engineering genuinely wants to own it. Building custom to save the subscription is the classic false economy: the app costs $1,200–4,200 a year; an engineer's maintenance attention costs more.
The two numbers that grade any route
Whatever you run, Events Manager grades it with two checks. One: dedup rate — browser and server Purchase events merging above 90% (below ~80%, your channels disagree about identity and attribution quality is bleeding). Two: parity — Purchase count within about 5% of the Shopify admin over the same window, using the same clock. Native passing both? You're done; close the vendor tabs. An app failing either? You bought visibility — use it: the per-parameter logs are exactly where the discrepancy hides. And if you're switching routes, run the new pipeline in test mode alongside the old one for a week, verify dedup on distinct test events, then cut over — two full pipelines reporting the same Purchase without a shared event_id is how stores end up with doubled ROAS for a month and a very awkward correction meeting.

The segmentation vendors won't draw — because the biggest branch doesn't pay anyone.

The sandbox race is why Purchase must be webhook-driven on EVERY route — the browser event is a companion, not the source of truth.
Frequently asked questions
Is Shopify's native Facebook integration good enough?+
Does Shopify's native integration use the Conversions API?+
Is Elevar worth the money?+
What is the Shopify Web Pixels sandbox problem?+
Should Purchase come from the browser or the server on Shopify?+
How do I know if my current Shopify tracking is fine?+
Why do my Recharge/subscription orders misreport to Meta?+
Can I run the native integration AND a tracking app together?+
Is a custom-built CAPI integration cheaper than an app?+
Do I still need browser events if the webhook sends Purchase?+
What breaks when Shopify updates checkout?+
Clean pipeline, serious account
Whitelisted infrastructure — rails that turn verified purchase signal into stable delivery.