Why is my visit data in Piano Analytics different to my click data in my advertising tool?
When you see discrepancies between Piano Analytics and campaign data from another tool, always keep in mind that a click on a campaign and a visit are two very different things, even though they are linked. A click is an interaction measured by the ad platform; a visit in Piano Analytics is a session that starts when your site/app actually sends its first tracked onsite event.
Below are common reasons why visits and campaign click data will never perfectly match, regardless of tracking method.
Key reasons clicks and visits differ
1) The user clicks but does not complete the page load
Advertising platforms typically record a click immediately. Piano Analytics records a visit only if the landing page loads and your Piano tag/SDK successfully sends an onsite event (for example, page.display).
If the user closes the tab, hits “Back,” loses network connectivity, or abandons before the tag fires, the click is counted but no visit is recorded.
2) Tracking parameters are lost in redirects (or by tracking templates)
If campaign parameters are cut off at any step of the journey—often during redirection chains (for example, some programmatic setups or Google Display Network flows)—Piano Analytics cannot detect the marketing campaign and will attribute the visit to a natural source (often Direct or Organic, depending on what remains available).
This is one of the most common causes of “missing” paid traffic in acquisition reports even when clicks look correct in the ad platform.
3) The click happens during an existing session (session timeout/source is already set)
In Piano Analytics, a visit is a session of activity that ends after 30 minutes of inactivity, at midnight (site time zone), or when identifiers are reset (for example, cookie deletion). Within a single visit:
An ad platform can record multiple clicks
Piano Analytics will still count one visit
The visit’s source is determined by the first event of the visit and is not replaced by later clicks by default
So if a user clicks a campaign link while already on your site (or returns within the session timeout window), the ad platform will count another click, but Piano Analytics may not create a new visit or change the visit’s source.
4) Consent and privacy settings can prevent marketing source collection
Depending on your privacy configuration and consent status, it is possible that the marketing source is not collected (for example, exempt mode configuration, or a visitor declining on the cookie consent banner).
Important implications:
If the first event of a visit occurs in a mode that does not allow campaign parameters to be stored/used, the visit may be attributed to Direct/Organic even if the landing URL contains campaign parameters.
If the visitor consents later, campaign parameters from the entry may not automatically be applied retroactively unless your implementation is designed to do so.
How to compare more accurately in Piano Analytics
Use the click.campaign.offsite event to analyze campaign clicks
Piano Analytics can generate the event click.campaign.offsite when campaign information is detected on an incoming hit (for example, via utm_* or at_* parameters mapped to campaign properties such as src_campaign, src_medium, etc.).
Use this when you want a “click-like” metric inside Piano Analytics:
Metric: Events (All) (or event count)
Filter: Event name equals
click.campaign.offsiteAdd breakdowns such as
src_campaign,src_medium, or your campaign name/type properties
click.campaign.offsite is an offsite-scoped event and does not increment the Visits metric. - A typical pattern is: clicks ≥ visitors ≥ visits, because multiple clicks can happen per visitor, and multiple clicks can happen within one visit.
Distinguish “click volume” from “visits attributed to a campaign”
To evaluate campaign-driven sessions, analyze Visits segmented by marketing source properties (for example src_campaign, src_medium, etc.). To evaluate interaction volume with tracked campaign links, analyze Events on click.campaign.offsite.