
Why Crypto Ad Tracking Is Inaccurate

Key takeaways
The main causes are ad blockers and privacy browsers, wallet in-app browsers, cross-device journeys, and the gap between click and onchain action.
The main fix is first-party collection through your own domain. It recovers much of the traffic that blockers drop.
Click IDs such as
gclidandfbclididentify the ad network even when the referrer is missing.Ad platform dashboards and your analytics will never match exactly. Pick one source of truth for spend decisions.
Measure ads by wallets, transactions, and retained wallets, not by clicks or platform-reported conversions.
Crypto ad tracking is inaccurate for two causes. First, crypto users block trackers, browse inside wallet apps, use VPNs, and switch devices. Second, the real conversion happens onchain, often long after the click. Ad platforms see only part of that journey and fill the gaps with modeled numbers. The fix is first-party tracking: capture the click on your own site, then tie it to the wallet and its onchain actions.
Why don't ad platform numbers match your analytics?
Ad platform numbers and analytics numbers differ because they count different things in different ways. The platform counts clicks and the conversions its own pixel or model can see. Your analytics counts sessions that loaded your script. Crypto users break both, so the gap is wider than in most other markets.
Measure | What the ad platform reports | What first-party analytics reports |
|---|---|---|
Clicks vs visits | Every billed click on the ad, including accidental clicks and bot clicks its filter missed | Only visits where the page and tracking script loaded |
Conversions | Events its pixel saw, plus modeled conversions | Events your own code recorded |
Attribution rule | The platform's own window and model | Your chosen model, such as first or last touch |
Onchain actions | Usually none, unless you send them back | Wallet connects and transactions, if wallet-aware |
Bot traffic | Filtered by the platform's own rules | Depends on your tool's bot handling |
Neither side is "right". They answer different questions. The platform tells you what it charged you for. First-party analytics tells you what happened on your site and onchain. For budget decisions in crypto, the second matters more.
What makes crypto ad tracking worse than other industries?
Crypto audiences use more privacy tools, more wallet apps, and more devices than the average web user. The conversion is also a signed transaction, not a form submit. Each of these breaks a different link between the ad click and the result, and they add up.
Ad blockers and privacy browsers
Many crypto users run ad blockers or use privacy browsers such as Brave, whose Shields are on by default and block third-party ads and trackers. Blockers stop known analytics scripts and requests to known tracking domains. Some browsers also remove known tracking parameters from links. Brave removes fbclid, gclid, and msclkid from cross-site navigations by default, and leaves them only on sites where the user turns Shields off (Brave, Brave wiki). Safari removes known click-level tracking parameters in Private Browsing, and in all browsing when the user turns on Advanced Tracking and Fingerprinting Protection; Apple does not publish the list (WebKit, 2024). The visit still happens, but your tools never see it, or see it without the click ID. Learn more about ad blockers.
Wallet in-app browsers
A user taps your ad on X, the link opens inside an app, and then they open your app inside a wallet's built-in browser to connect. In-app browsers often drop the referrer. Without a referrer or a UTM, the visit looks like direct traffic. The ad gets no credit.
VPNs
VPNs are common in crypto. They change the visitor's apparent country and IP address. That breaks country-level campaign reports and any platform matching that relies on IP. It can also make one person look like several visitors, or several people look like one.
Cross-device journeys
A common path: the user sees your ad on a desktop, then opens your app in a mobile wallet to transact. Or the reverse. Unless both devices share an identifier, the desktop click and the mobile transaction look like two unrelated people.
The gap between click and onchain action
People research before they risk funds. They click an ad, read docs, check a dashboard on another site, and transact days later. Some ad platforms only credit conversions inside their own window. Onchain actions that happen outside that window, or outside your website, never reach the platform at all.
Ad platform restrictions on crypto
Major ad platforms restrict crypto ads. Many require advertiser certification and limit which products and countries you can target. For example, Google Ads requires certification for crypto exchanges and software wallets in approved countries, and does not allow ads for DeFi trading protocols (Google Ads policy, checked 2026-11-08). Policies change often, so check each platform's current rules. Restrictions push teams toward crypto-native ad networks, KOLs (key opinion leaders), and sponsored posts, which often do not report conversions back in a standard way.
Bot traffic
Ads attract bots: click farms, scrapers, and automated wallets that farm incentives. Platforms filter some invalid clicks. The rest land on your site and inflate visitors. In crypto, bots can also connect wallets and transact, so a high conversion count is not proof of real users. See bot traffic.
How do you fix inaccurate crypto ad tracking?
Fix crypto ad tracking by collecting data first-party, keeping click IDs and UTMs on every landing URL, and joining each visit to the wallet that later transacts. Then judge each campaign by wallets and onchain value, not by platform-reported conversions. These steps do not make tracking perfect, but they close the largest gaps.
Serve tracking from your own domain. Route analytics through a reverse proxy on your domain so that blockers that match known tracking domains do not drop it. Formo recommends a reverse proxy for ad blockers and privacy browsers, with setup guides for Next.js rewrites, Next.js middleware, and your own proxy on services such as CloudFront or Cloudflare, passed to the SDK as
apiHost.Bundle the SDK. If you install the analytics package from npm, it ships inside your app code and is not loaded from a third-party CDN. The HTML snippet loads the script from Formo's CDN, so prefer the npm package where blockers are common.
Track key actions server-side. Send conversions from your backend when they are confirmed. Formo's server SDK (
@formo/analytics-node) tracks events and identifies wallets from your backend. Our guide to server-side tracking for crypto apps covers this in depth.Keep auto-tagging on. Ad platforms append click IDs to your landing URLs when auto-tagging is on. Formo captures supported click IDs automatically, with nothing to configure.
Add UTMs on top. Click IDs tell you the network. UTM parameters tell you the campaign, creative, and keyword. Use both on every ad, and on every KOL and sponsored link that has no click ID.
Tie visits to wallets. Use wallet-aware analytics so the ad visit, the wallet connect, and the transaction sit on one profile.
Filter bots before you report. Exclude known bots from visitor counts, and check wallet quality before you trust conversion counts.
How do click IDs and channel mapping help?
Click IDs help because the ad network adds them to the landing URL itself, so they survive when the referrer is lost. A visit with a Google click ID is a Google Ads visit, even if it came through an in-app browser with no referrer. Channel mapping then groups each network into a channel you can compare.
Formo reads eight click IDs and maps click-ID-only traffic like this:
Click ID | Ad network | Channel |
|---|---|---|
| Google Ads | Paid Search |
| Microsoft Ads | Paid Search |
| Meta Ads | Paid Social |
| TikTok Ads | Paid Social |
| X Ads | Paid Social |
| LinkedIn Ads | Paid Social |
| Reddit Ads | Paid Social |
Click IDs feed channel classification so that these networks classify as Paid Search or Paid Social even when an in-app browser omits the referrer. A paid utm_medium, such as cpc or paid_social, also counts as a paid signal. In Formo, the Ads tab on the Overview page shows paid sessions and visitors by network, and you can break down wallets, transactions, volume, and revenue by ad network.
Crypto-native ad networks and KOL posts often have no click ID. For those, UTMs and referral codes are your only reliable signal, so tag every link. UTMs also help when a privacy browser strips the click ID, because Brave and Safari target click-level parameters, not campaign-level ones.
How do you tie ad conversions to wallets and onchain events?
Tie ad conversions to wallets by recording the click context on the visit, linking that visit to the wallet when it connects, and then attributing later transactions to the same wallet. The ad then gets credit for onchain value, not just for a page view. This is the step that platform pixels cannot do.
Here is how it works in Formo, and where the limits are:
The wallet keeps its ad history. Users carry first-touch and last-touch ad attribution across their whole history. There is no conversion lookback window that expires the click.
Contract events inherit the session. An onchain event inherits the UTM and referrer of the same wallet's SDK session from the last hour. If the wallet had no SDK session in that hour, Formo attributes the event to Direct. So the event-level channel can say Direct while the wallet's first touch still says Paid Social. Use wallet-level attribution for ad ROI.
Devices link through shared identifiers. Wallets link when they share a device identifier (the anonymous ID cookie) or the same user ID set with identify. If your app has accounts, call identify on both devices so the desktop click and the mobile transaction join up.
Funnels show conversion by network. Build a funnel of Visit, Connect, and Transaction. Break it down by Ads to compare conversion rates by network. The default conversion window is 2 hours; lengthen it for products where people research first.
Retention shows quality. Segment retention cohorts by Ads to see whether paid wallets stay.
How do you handle bot traffic in ad reports?
Handle bot traffic by labelling it, excluding it from the numbers you report, and checking the quality of wallets that convert. Do not trust raw visitor counts from a paid campaign until you know how much of it is automated. A campaign with many visitors and no retained wallets is a warning sign.
Formo labels known crawlers and automated clients with the device type Bots. Formo does not remove bot traffic from Visitors, Sessions, or Bounce Rate. To leave it out, add a Device filter that excludes Bots. User-agent rules catch declared bots, not every automated wallet. So also compare wallet quality by ad network: wallet age, net worth, and retention. Fresh, empty wallets that transact once and never return are a sign of incentive farming.
Symptom | Likely cause | What to check |
|---|---|---|
Platform clicks far above analytics visits | Blockers, bots, slow landing page | Proxy setup, page speed, bot filter |
Many visits marked Direct during a campaign | In-app browsers dropping referrer, missing UTMs | Click ID capture, UTM on every link |
Many visits, few wallet connects | Bots or poor targeting | Device filter, landing page |
Many connects, no retention | Incentive farmers | Wallet age and net worth by network |
Platform conversions above onchain transactions | Modeled conversions, longer platform windows | Compare wallets and transactions, not platform conversions |
Frequently asked questions
Why do Google Ads and my analytics show different numbers?
They count different things. Google Ads counts clicks and the conversions it can see or model. Your analytics counts visits that loaded your tracking. Blockers, bots, in-app browsers, and different attribution windows all widen the gap. Use first-party wallet data for spend decisions.
Does Brave block crypto analytics?
Brave Shields are on by default and block known third-party trackers. Brave also removes click IDs such as fbclid and gclid from cross-site links unless the user turns Shields off for the site. Serving analytics through your own domain with a reverse proxy, and bundling the SDK in your app, reduces the data you lose.
What is a click ID?
A click ID is a unique value an ad network adds to your landing URL when someone clicks an ad, such as gclid for Google Ads or fbclid for Meta. It lets analytics identify the ad network even when the browser sends no referrer.
How do I attribute an onchain transaction to an ad?
Capture the click ID and UTMs on the landing visit, link that visit to the wallet when it connects, and attribute the wallet's later transactions to its first-touch or last-touch source. Formo keeps first-touch and last-touch ad attribution across a wallet's whole history.
Does server-side tracking fix ad tracking?
It fixes part of it. Browser extensions do not block server-side events, so confirmed conversions arrive reliably. You still need the browser visit to capture the click ID and UTMs, so combine it with first-party client tracking.
Should I trust ad platform conversion numbers for crypto?
Use them to manage the platform, such as bids and creatives, but not as your source of truth for ROI. Platforms rarely see onchain actions. Compare spend with wallets, transactions, and retained wallets from your own data.
Related articles
Glossary: server-side tracking, first-party cookie, bot filtering, traffic channel, wallet-level attribution.


