Short version: sales attribution — knowing which channel produced which closed deal — does not require HubSpot Enterprise at $3,600/mo. It requires consistent UTM tagging, a short-link manager you actually use, a CRM that stores first-touch and last-touch on the contact record, and a weighted multi-touch model you trust. The whole setup runs on a flat-tier CRM at $400/mo. Here's the build.
Why most attribution is broken
I audit a lot of marketing budgets. The conversation almost always goes like this: "We're spending $12K/mo on Google Ads, $8K/mo on Meta, $4K/mo on LinkedIn, and $3K/mo on SEO content. Which one is working?" And the honest answer is almost always "you don't know, because you can't tell which channel generated the $180K of closed deals last quarter."
The reason isn't budget. It's hygiene. Three failures, all fixable in a week:
- UTM parameters aren't on every campaign link. The clicks come in but the source is blank.
- The CRM doesn't store "first-touch source" as a permanent field on the contact. So when the contact converts 60 days later via a referral, the original ad campaign gets zero credit.
- The team is using "last-touch" only — whoever sent the last email gets credit for the deal. Which means SEO content that started the relationship 90 days ago looks worthless.
Fix those three and you have working attribution. No HubSpot Enterprise required.
Step 1: UTM convention (you need exactly one)
A UTM convention is a 5-field tagging scheme that goes on every campaign URL. Pick one convention and enforce it across the team. The standard:
utm_source — the platform (google, meta, linkedin, instagram, email, partner-name). utm_medium — the channel type (cpc, organic, social, email, referral, affiliate). utm_campaign — the named campaign (q1-2026-discovery, summer-promo, holiday-gift). utm_content — the creative variant (carousel-v2, headline-a, video-30s). utm_term — the targeting term (paid search keyword, or audience name).
Example: https://www.zayrev.com/crm?utm_source=google&utm_medium=cpc&utm_campaign=q1-2026-crm&utm_content=headline-flat-tier&utm_term=hubspot-alternative
Three rules:
- Lowercase everything. "Google" and "google" are different sources to your analytics. Pick one.
- No spaces. Use hyphens. "Q1 2026" becomes "q1-2026."
- Use a sheet to centrally manage campaign names. Three people on the team using "q12026crm," "q1-crm-2026," and "q1_crm_2026" produces three different data lines.
Step 2: short-link manager
UTM URLs are ugly. https://www.zayrev.com/crm?utm_source=google&utm_medium=cpc... is unusable in an email, SMS, or print ad. You need a short-link manager that wraps the long URL.
Options:
- Built-in CRM short-link. Zay CRM Growth and Pro tiers include a short-link manager. Generate
zay.rev/abc123 with the underlying UTM-tagged URL. Click data feeds the attribution dashboard automatically. - Bitly Standard — $35/mo for branded short links + click tracking. Integrates with Zapier into most CRMs.
- Rebrandly Lite — $24/mo. Same use case, slightly less polish.
Whatever you pick, every campaign URL goes through it before it hits a customer. No exceptions.
Step 3: capture first-touch + last-touch on the contact record
This is the field setup most CRMs ship blank. You have to enable it.
Two fields, every contact, set once and never overwritten:
- First-touch source. The first UTM source that touched this contact, ever. Set once when the contact is created. Never changes.
- First-touch campaign. Same. The campaign that brought them in originally.
Two fields that update on every interaction:
- Last-touch source. The most recent UTM source. Updates every time the contact clicks through a tracked link.
- Last-touch campaign. Same.
In Zay CRM these are core fields on the contact record. In HubSpot Pro they're available but you need to wire them via workflows. In Pipedrive you build them as custom fields. Salesforce ships them out-of-box. Every modern CRM can do this — you just have to actually set it up.
Step 4: pick an attribution model (and own the tradeoff)
There are four common attribution models. Each one tells a different story:
Last-touch
The campaign that brought the contact in immediately before the deal closed gets 100% credit. Pro: simple. Con: brutally penalizes top-of-funnel content. SEO that earned the relationship 90 days ago looks worthless because the closing email gets all the credit.
First-touch
The first campaign that ever touched the contact gets 100% credit. Pro: rewards top-of-funnel. Con: brutally penalizes the closing channel. Sales-led campaigns look worthless.
Linear (multi-touch, equal weight)
Every touchpoint along the path gets equal credit. 5 touchpoints, each gets 20% of the deal value. Pro: fairer. Con: treats a low-engagement display impression the same as a sales call.
Weighted multi-touch (40-40-20)
First touch gets 40%, last touch gets 40%, middle touches split the remaining 20%. Pro: recognizes that the start and end of the buying cycle matter most. Con: the 40-40-20 weights are a judgment call, not a discovered truth.
For most service businesses doing $500K-$5M ARR, 40-40-20 weighted multi-touch is the right tradeoff. It rewards both top-of-funnel (so you keep investing in SEO and content) and bottom-of-funnel (so you keep investing in sales follow-up). It also matches the math of how deals actually close.
Step 5: the attribution dashboard you actually look at
Three views, refreshed monthly:
View 1: Source-level ROI
- For each utm_source (google, meta, linkedin, email, referral, organic, etc.):
- Total ad spend last 30 days
- Number of contacts whose first-touch source matches
- Number of deals closed whose attribution credit assigns to this source (under 40-40-20)
- Revenue attributed
- ROI ratio (revenue ÷ spend)
View 2: Campaign-level ROI
Same but by utm_campaign. Shows you which specific campaigns won versus lost.
View 3: Time-to-close by source
For each source, what's the average days from first-touch to closed-won? This matters because a 60-day-to-close source needs to be measured on a longer rolling window than a 7-day-to-close source. If you measure SEO on a 30-day window, it always looks worse than it actually is.
Step 6: feed the attribution data back into the budget
The point of attribution isn't the dashboard. It's the budget decisions. Every quarter:
- Channels with ROI ratio above 3:1 — increase budget 20-30%.
- Channels with ROI ratio between 1.5:1 and 3:1 — hold steady, test creative variants.
- Channels with ROI ratio below 1.5:1 — cut budget by 50% and analyze why. Sometimes the channel is genuinely bad; sometimes it's a tracking gap.
- Channels with no measurable ROI ratio (because attribution isn't capturing them) — fix the tracking before cutting the budget. Most "channels that don't work" are actually "channels we can't measure."
The "dark social" problem (and how to live with it)
Some traffic is genuinely unattributable. A prospect sees your LinkedIn post, copy-pastes the URL into a Slack DM with a colleague, the colleague pastes it into their browser, and now you have a "direct" visit with no UTM. This is dark social, and every honest attribution model has 15-30% of traffic that lands here.
Two practical responses:
- Lead source self-attribution. Ask every inbound contact on the intake form: "How did you hear about us?" Free-text or 5-option select. Captures the dark social that UTMs miss.
- Don't pretend the dark social bucket is zero. Show it on the dashboard. "Direct / Unattributed: 22% of deals." Pretending it's zero by force-attributing to last-paid-touch is what creates the budget mistakes.
What HubSpot Enterprise adds (and whether you need it)
HubSpot Enterprise at $3,600+/mo adds:
- Custom attribution models beyond first/last/linear/weighted.
- Account-based attribution (assigning credit at the company level, not just contact).
- Multi-currency revenue attribution.
- The "Single Customer View" with timeline of every touchpoint.
If you're a $50M+ ARR B2B SaaS with a 9-month buy cycle and 12 stakeholders per deal, those features earn the price. If you're a service business doing $500K-$5M ARR with 1-3 stakeholders per deal, you don't need them. The 40-40-20 weighted model on a flat-tier CRM tells you 90% of what HubSpot Enterprise would tell you, at 5-10% of the cost.
Setting this up in Zay CRM
The Attribution dashboard ships on Growth ($400/mo) and Pro ($950/mo) tiers. Source-level ROI, campaign-level ROI, first-touch/last-touch fields on every contact, time-to-close by source. Short-link manager in Settings → Marketing → Short Links.
UTM convention: define yours once in Settings → Marketing → UTM Schema. Validates inbound URLs against the convention and flags non-compliant tags.
Start the 7-day trial with the Growth tier. Bring last quarter's campaign list and have attribution running by end of day 2. Or compare against alternatives in the full pricing comparison.
The bottom line
Attribution is a hygiene problem disguised as a software problem. Get UTMs on every link, capture first-touch and last-touch on the contact record, pick the 40-40-20 weighted model, refresh the dashboard monthly, feed the result back into budget decisions. That's the entire system. The expensive CRM doesn't make this easier — it just makes it more expensive.
Get this set up — Zay CRM 7-day trial · CRM services · phone 321-666-1102.