Most attribution tools sold in 2026 are predicting yesterday's revenue. They were designed for a world where third-party cookies existed, where Facebook had server-to-server signal back to the platform, where Apple let advertisers see the click-through path. None of that is true anymore.
The attribution model that actually predicts revenue in 2026 is simpler than what most vendors are selling. It uses three signals: a self-reported first-touch question, a server-logged last-touch, and a probabilistic weight on assisted touchpoints from your own data layer. Everything else is noise dressed up as science.
// noteStop paying attribution vendors more than $300/mo. The model that works is 200 lines of SQL and a self-reported question on the form. Anyone selling you a black-box attribution tool above that price is selling you confidence, not accuracy.
Why the Old Models Don't Work Anymore
A quick history. Through ~2020, the dominant attribution model was last-click — easy to implement, easy to game, mostly worked because cookies were universal. Through ~2022, multi-touch attribution (MTA) took over — vendors like Bizible, Heap, and Mixpanel marketed full-funnel paths from first impression to closed deal.
Then iOS 14.5 dropped App Tracking Transparency in April 2021. Then iOS 17 in September 2023 added Link Tracking Protection — automatic stripping of UTM-like tracking parameters from URLs in Mail, Messages, and Safari. Then iOS 18.2 in late 2024 extended that protection to in-app browsers. By the time iOS 18.4 shipped in early 2025, roughly 60% of the click-based signal that attribution vendors relied on was simply gone.
Vendors responded with probabilistic modeling — essentially statistical guesses that fill in the missing data. That can work for high-volume B2C with millions of conversions, but for B2B SaaS with 500 conversions per quarter, probabilistic models hallucinate. They produce confidently-wrong attribution that founders then use to make budget decisions.
The Three-Signal Model
Our model uses three signals. Each is high-confidence on its own. Combined, they form a more accurate picture of which channels are actually driving revenue than any vendor product we've tested.
Signal 1 — First-Touch (Self-Reported)
Ask every customer: 'How did you hear about us?' That's it. One question on every conversion form. 95%+ accuracy when it's the only question — the accuracy drops fast when you add more attribution-related questions to the same form.
The trick is to make it the only attribution question, place it at the bottom of the form, and accept free-text — not a dropdown. Dropdowns force people into your pre-imagined categories. Free-text reveals categories you weren't tracking.
We then run the free-text answers through a quick Claude classifier weekly to bucket them into clean categories. The classifier is 30 lines of prompt + a regex pre-filter for obvious matches. Takes about 5 minutes per quarter to maintain.
Signal 2 — Last-Touch (Server-Logged, Not Client-Side)
When the conversion event fires (form submit, payment, signup — whatever you define), your server logs the destination URL, UTM parameters, click IDs (gclid, fbclid, msclkid), referrer header, and the IP-derived country/city. Everything captured server-side, not client-side. iOS 17's tracking protection strips client-side parameters; it can't strip server-logged data.
This is the data layer that exists in your own database. It's not shared with any third party. It survives every iOS update. It's the only attribution data you should fully trust.
- ▸Full UTM set: utm_source, utm_medium, utm_campaign, utm_term, utm_content
- ▸All major click IDs: gclid (Google), fbclid (Meta), msclkid (Microsoft), li_fat_id (LinkedIn), ttclid (TikTok), twclid (X/Twitter)
- ▸Referrer header (the page the user came from)
- ▸IP geo: country, region, city — populated automatically by Vercel/Cloudflare edge
- ▸Timestamp of every touchpoint, not just the conversion
Signal 3 — Assisted (Probabilistic, Internal Only)
Inside your own analytics (PostHog, Snowplow, or similar), you can see session journeys. A user lands on page A from organic search, leaves, comes back two days later via direct, browses for 6 minutes, then converts. The assisted touchpoint here is the organic-search session — it primed the eventual conversion.
Assisted weight is probabilistic by design. We never share assisted attribution numbers externally (with investors, partners, or in marketing material). They're directional internal data, useful for prioritizing channel investment, dangerous if treated as ground truth.
How the Signals Combine
We weight the three signals as follows in the default model:
- ▸First-touch (self-reported): 50% weight. The strongest signal of 'where did this customer come from in their own words.'
- ▸Last-touch (server-logged): 35% weight. The strongest signal of 'what closed the deal.'
- ▸Assisted (probabilistic): 15% weight. Directional context that catches the long-tail channels self-reporting misses.
The weights are tunable per engagement. For long-cycle enterprise sales (90+ days), we push first-touch up to 65% — the conversation between first-touch and last-touch was long enough that the original source is the more meaningful signal. For low-consideration impulse purchases (D2C, app installs), we push last-touch up to 55%.
The Actual SQL
The attribution model lives in two dbt models. The full implementation is under 200 lines. We're not going to paste all of it here, but the structure is:
- ▸Model 1 — `touchpoints_clean`: deduplicate, normalize UTMs, classify free-text first-touch answers, geocode IPs
- ▸Model 2 — `revenue_attribution`: for each customer, compute weighted score per channel; join to revenue events for $-per-channel rollup
Total maintenance: ~30 minutes a week from one analyst. Total infrastructure cost: $0 incremental (runs on the same Postgres as everything else). Total accuracy delta vs the leading vendor product we benchmarked against: +12 percentage points on a 6-month closed-loop test.
What This Catches That Vendors Miss
Three categories of revenue contribution that black-box attribution tools systematically under-weight:
1. Dark Social
WhatsApp, Slack, Telegram, iMessage. None of these pass UTMs (especially after iOS 17). All of them produce massive top-of-funnel referral in B2B SaaS — typically 20–35% of qualified leads in our cohort engagements.
Vendor tools attribute these to 'direct' (because the user pastes a clean URL). Self-reported first-touch catches them. 'A friend sent me your link in Slack' becomes a real bucket, not a black hole.
2. Podcasts and Community
Podcast listeners convert by typing your URL directly into their browser days or weeks later. There's no click. There's no UTM. There's nothing for a click-based attribution model to see. Self-reported first-touch picks this up. Vendor tools don't.
3. Search-Then-Direct
User searches your brand on Google (an organic touchpoint), clicks, leaves, comes back via direct two days later, converts. The vendor attributes this to direct, missing the organic moment. The three-signal model catches it via the assisted-touchpoint weighting.
// noteIf your attribution dashboard says 40%+ of revenue comes from 'direct,' you don't have an attribution model — you have an attribution gap. Real direct traffic should be 8–15% of total in B2B SaaS. Anything higher means your model is failing.
Practical Setup — Day-One Implementation
- 01Add the self-reported first-touch question to every conversion form. Free-text. Required. Place at the bottom of the form so it doesn't kill conversion rate.
- 02Capture all UTM params + click IDs server-side, not via Google Tag Manager. We use a small Next.js API route that logs to Postgres on every conversion event.
- 03Set a first-touch cookie on the first session (90-day TTL). Use this to populate `first_touch_url`, `first_touch_referrer`, and `first_touch_utm_*` on conversion.
- 04Set a session cookie that tracks pageviews + duration. Helps with assisted-touchpoint weighting.
- 05Build the two dbt models. Review weekly in the Friday operator review with the founder.
What to Stop Doing
- ▸Stop using last-click as your default. It's lying about 60% of your channels.
- ▸Stop paying vendors $1K+/mo for attribution tools unless you're above $5M ARR and the team has fully bought into the model.
- ▸Stop reporting attribution percentages to investors with two-decimal precision. Attribution is directional, not surgical. Round to the nearest 5%. Anything more precise is theater.
- ▸Stop running multivariate marketing-mix models with under 100 conversions per quarter. The math doesn't converge.
Run This Model on Your Funnel?
Book a 30-min call. We'll review your current attribution setup, identify the gaps it has, and tell you whether the three-signal model would change your channel-spend decisions. Most engagements find at least one channel that's been getting wrongly credited (or wrongly discounted) by 30%+ for months.
