TL;DR: Attribution models are only as accurate as the data feeding them. Most VPs of Growth trust numbers that are systematically wrong -- not because their attribution tool is bad, but because the data pipeline upstream has 5 specific infrastructure gaps. This post names those gaps and explains what fixing each one actually looks like.


The attribution problem is upstream

When ROAS looks suspiciously good and CAC feels wrong, the default response is to audit the attribution model. Change the lookback window. Try a different model -- linear instead of last-click. Switch from Google Analytics to a third-party attribution tool.

Most of the time, the attribution model is not the problem.

The problem is the data that feeds the model. And most data stacks feeding attribution systems were not designed with attribution accuracy in mind. They were stitched together as the company grew -- an event tracking library here, a warehouse connector there, a data analyst building dbt models on nights and weekends. The result is a data layer that produces numbers with the right format but the wrong values.

Here are the five infrastructure requirements your attribution model needs to produce reliable numbers, and what breaks when each one is weak.


1. Event collection integrity

Attribution is fundamentally an exercise in counting events: a user clicked an ad, visited a page, signed up for a trial, converted to a paid account. If your event collection is unreliable, every downstream calculation is corrupted at the source.

What weak event collection looks like:

Server-side and client-side events are mixed without reconciliation. A user who clicks an ad fires a client-side event in your analytics tool. The same conversion fires a server-side event in your backend. Both land in your warehouse, and your attribution query double-counts them. Your conversion volume is inflated by 15-30% before you even run a model.

Ad blocker gaps are another common failure. Browser-based event collection is increasingly blocked -- depending on your audience, you may be missing 15-40% of touchpoints from browser-level ad blocking and ITP (Intelligent Tracking Prevention) in Safari. If you are not using server-side event forwarding, your touchpoint data has a systematic blind spot in exactly the segment where blocking rates are highest (typically enterprise and developer personas).

Sampling without awareness is the silent killer. Some analytics tools sample data above certain volume thresholds. If your analytics platform is sampling at 10% and your attribution model is treating the reported numbers as 100%, your CAC is off by a factor of 10 in the wrong direction.

What the fix looks like: Server-side event collection with deduplication logic in the warehouse. This means sending events from your backend, not just your browser, and joining on a stable event ID before aggregating. It also means reconciling your event pipeline against your source-of-truth systems (CRM records, Stripe charges) on a regular basis to catch systematic discrepancies.


2. Identity resolution

Attribution models need to connect touchpoints to outcomes. That requires knowing that the user who clicked an ad three weeks ago is the same user who signed up today. Most data stacks handle this poorly.

What weak identity resolution looks like:

Anonymous IDs fragment the user journey. A visitor arrives via a paid search ad and gets an anonymous session ID. They leave, come back from a direct visit two days later, and get a different anonymous session ID. When they eventually sign up, their email address is recorded -- but no one stitches the two anonymous sessions together. Your attribution model treats these as two separate users with one touchpoint each instead of one user with two touchpoints.

Cross-device gaps make this worse. A user sees your LinkedIn ad on their phone, does research on their laptop, and converts on their work desktop. Without cross-device identity resolution, each session is an island. Last-click attribution gives all credit to whatever happened on the work desktop -- probably a branded search that happened because the LinkedIn ad worked.

CRM and warehouse identity mismatches create a different class of problem. Your warehouse user IDs may not match your CRM contact IDs, especially if your stack grew organically. Attribution models that join across these systems produce silent failures: rows that do not join, contacts that appear in one system but not the other, duplicate records that inflate conversion counts.

What the fix looks like: A deterministic identity graph in the warehouse. This means a mapping table that connects anonymous IDs, device IDs, email addresses, and CRM IDs for each user, built and maintained as a core data asset. When this does not exist, identity resolution falls to whichever BI tool or attribution platform your team uses -- and they will each resolve it differently, producing numbers that do not agree.


3. Cross-channel event stitching

Attribution models are designed to evaluate performance across channels. But the data from each channel arrives in a different format, at a different granularity, with different timestamp conventions, and through different APIs. Stitching them into a coherent picture is a data engineering problem that often does not get solved rigorously.

What weak cross-channel stitching looks like:

Channel-native metrics replace pipeline metrics. Instead of a unified touchpoint table covering all channels, your team ends up with a Google Ads dashboard, a Facebook Ads dashboard, a LinkedIn Campaign Manager tab, and a HubSpot report -- each using its own attribution logic. When your CMO asks for blended CAC, someone manually pulls numbers from each platform into a spreadsheet. This is not attribution analysis. It is manual reconciliation of numbers that do not agree on what they are measuring.

Click ID coverage varies by channel. Google Ads uses GCLID. Meta uses FBCLID. LinkedIn uses its own click parameter. When landing pages fail to capture these parameters -- because a form strips UTM parameters on submission, because a redirect loses query strings, because mobile app links work differently than web links -- you lose the ability to connect ad clicks to downstream conversions with certainty.

Self-attribution by platforms inflates channel performance. Every ad platform attributes as much credit as its model allows. Meta will claim credit for a conversion that Google also claims. Without a neutral, warehouse-based attribution model, you are asking each channel to grade its own homework.

What the fix looks like: A unified touchpoint table in the warehouse that covers every channel, uses consistent timestamp and granularity conventions, and includes click IDs where available. The table is the authoritative record that the attribution model reads from -- not a downstream export from each ad platform.


4. Time-window consistency

Attribution models require you to define lookback windows: how far back should we look for touchpoints that may have contributed to a conversion? The answer affects every ROAS and CAC calculation your team produces. Most data stacks handle time windows inconsistently.

What weak time-window handling looks like:

Platform windows and warehouse windows do not match. Google Ads defaults to a 30-day click lookback and a 1-day view-through window. Your warehouse query uses a 14-day window because that is what someone set up originally. Meta uses its own default windows. When your team tries to reconcile platform-reported conversions against warehouse-computed conversions, the numbers differ -- and they differ systematically by channel, because each platform has different default windows.

Timezone mismatches shift events across day and week boundaries. Your ad platforms likely report in the account timezone (often US Eastern or Pacific). Your warehouse may store timestamps in UTC. A conversion at 11:30pm Eastern on a Sunday looks like Monday morning UTC. When you aggregate by week, conversions that belong to one week appear in another. For campaigns with day-of-week optimization, this corrupts the signal you are trying to measure.

Window definitions change retroactively. When someone changes the lookback window in an attribution tool, the historical numbers often recompute. A channel that looked like it was performing well under a 30-day window may look weaker under a 7-day window. If you are comparing current performance to historical benchmarks, this recomputation invalidates the comparison -- and it often happens silently.

What the fix looks like: Explicit, code-defined time window logic in your warehouse -- in dbt models or SQL procedures -- with the window parameters as documented, version-controlled variables. This makes it impossible for a tool configuration change to silently alter historical numbers, and it makes it easy to run attribution under multiple window assumptions when you want to stress-test a result.


5. Source-of-truth reconciliation

Every attribution system eventually needs a ground-truth record of what actually happened: how many trials actually started, how many actually converted to paid accounts, what the actual revenue figures were. Without a disciplined reconciliation process, attribution numbers drift away from financial reality.

What weak source-of-truth reconciliation looks like:

Attribution counts and CRM counts diverge. Your attribution model reports 85 conversions last month. Your CRM shows 72 new customers. The difference is real, but no one knows where it comes from. Maybe it is duplicate events. Maybe it is leads that converted and then refunded. Maybe it is a date boundary issue. Without a regular reconciliation process, this gap grows quietly while people on each team defend their own numbers.

Revenue figures do not tie to billing. Attribution models that try to include revenue attribution -- connecting a paid search click to eventual contract value -- frequently use MRR or ARR estimates from the CRM rather than actual invoice amounts from the billing system. These differ because of discounts, contract amendments, and churn in the cohort. The result is attribution models that show ROAS calculations disconnected from actual financial performance.

Delayed conversion signals corrupt recent performance. Trial conversions that depend on a 14-day free period are not observable at day 14 -- some will convert on day 12, some on day 20. If your attribution pipeline runs nightly and treats last night's data as complete, recent cohorts look systematically worse than they actually are. This is a reporting lag problem, not a channel performance problem.

What the fix looks like: A weekly or monthly reconciliation job that compares attribution-layer event counts against CRM records and billing system records. Discrepancies above a threshold trigger an alert. The reconciliation output is documented so that everyone on the growth team knows which system is the authoritative source for which metric.


The pattern across all five failures

These failures are not independent. Weak event collection makes identity resolution harder. Poor identity resolution makes cross-channel stitching unreliable. Inconsistent time windows interact with delayed conversion signals to corrupt recent performance views. Source-of-truth reconciliation is the only mechanism that catches all of them -- but only if someone is looking at the output.

Most growth teams discover one of these failures when a number gets questioned in a business review. They fix that specific instance. The others remain.

The systematic approach is to treat your attribution data pipeline as a first-class engineering system: one with ownership, tests, documentation, and regular reconciliation against ground truth. In companies that have done this well, attribution numbers become trustworthy enough that the team argues about strategy rather than data quality.


What this means for your next budget decision

If you are making channel spend decisions based on attribution numbers and you have not audited whether these five requirements are met, you do not know whether those numbers are reliable. Some of the channels that look best may look that way because of data artifacts. Some that look worst may be under-credited.

The audit does not require replacing your attribution tool. It requires examining the data pipeline feeding that tool.

If your ROAS or CAC numbers feel off, the problem is usually upstream. We build the data infrastructure that makes attribution actually work. Book a free 30-minute diagnostic: https://calendar.app.google/ebttpWW5efCSzY2D6


FAQ

What is the most common attribution data pipeline failure?

In my experience, identity resolution breaks more attributions than anything else. When anonymous pre-signup sessions are not stitched to post-signup user records, touchpoints that influenced the decision appear as unattributed direct traffic. This systematically under-credits awareness channels and over-credits last-touch channels.

Should I fix my data pipeline before or after switching attribution models?

Fix the pipeline first. Switching from last-click to data-driven attribution with a broken event pipeline just means your errors are distributed differently across channels. The noise level stays the same. A cleaner pipeline with a simple model outperforms a sophisticated model on corrupt data every time.

How do I know if my attribution data pipeline has these problems?

The quickest diagnostic is a reconciliation check: compare your attribution tool's reported conversion count against your CRM's new customer count for the same period. If they differ by more than 5-10%, something in the pipeline is broken. The same check against your billing system for revenue attribution will reveal a second layer of issues.

What does it cost to fix an attribution data pipeline?

The scope depends on how many channels you track and how fragmented your current stack is. In most cases, the core infrastructure -- a unified touchpoint table, an identity resolution layer, and a reconciliation job -- is a well-scoped engineering project. Most of my clients see the largest wins from event deduplication and identity resolution, which are often solvable in two to three weeks of focused work.