How Attribution Works Now
The dashboard used to let you switch between seven simulated multi-touch models (Last Touch, First Touch, Linear, Time Decay, U-Shaped, W-Shaped, Data-Driven/Shapley). That system was built on synthetic conversion paths (sequences of ad clicks stitched together with assumptions, not real HubSpot data), and it's gone, along with the "Model compare" page that used to show it.
What replaced it: every HubSpot contact is attributed to exactly one real channel, decided once from the actual data HubSpot recorded about how that person arrived: a hand-curated source field where the client maintains one, otherwise UTM parameters, click IDs, or HubSpot's own tracking fields, checked in a fixed priority order. There's nothing to "switch" because there's no simulation to switch between. The number you see is the number the data actually says.
You no longer need to explain "we chose W-Shaped because your sales cycle is 90 days." You can say: "This is where your actual leads came from, according to your own CRM." That's a stronger, simpler claim, but it also means you can't paper over thin data with a model that spreads credit around generously. If a channel shows zero leads, it's because HubSpot's data genuinely doesn't point to that channel for any contact in the period, not because a model happened to weight it low.
Tiers & What Each Client Sees
No HubSpot connection. The dashboard shows spend, clicks, and impressions by channel: no leads, no revenue. Common for clients just getting started, or where GK3 only manages media, not CRM.
HubSpot is connected and contacts are attributed to channels. Revenue is estimated: contacts that reached the Customer lifecycle stage, multiplied by the client's average deal value. Always label this as an estimate to a client; it's a reasonable proxy, not a real number pulled from closed deals.
Tier 2's estimate above only works once this number is set: a new or lower-tier client sits at $0 by default, which shows as $0 estimated revenue no matter how many leads convert. Deal Settings lists every client with their current value and an editable field to set a new one; a reasonable ballpark from the client (even a round number) is enough to make Tier 2's estimate meaningful instead of blank. Has no effect on Tier 3 clients: their revenue already comes from real closed deals.
The client keeps HubSpot deals updated. Revenue is the real sum of closed-won deal amounts, grouped by the channel that originated each deal's contact where that link can be made. This is the only tier where "Revenue" on the dashboard is an actual dollar figure from the client's own CRM, not an estimate.
Reading the Dashboard
Start with the HubSpot Conversion Anchor panel. It tells you how many real contacts and (for Tier 3 clients) closed-won deals are behind the numbers. If a banner appears saying pipeline hasn't been tracked, stop: that client is in media-performance mode, see the section below before you say anything about "revenue."
Then check the KPI row. For a normal client this is Spend / Revenue / Blended ROAS / HubSpot Conversions. For a media-performance client, the middle two swap to Cost Per Lead / Leads per $1K Spend.
Then open Media Mix Analysis (when it's showing): this is your strategic talking point for the client conversation.
The key comparison is spend share vs. revenue share (or lead share, in media-performance mode). If a channel holds 80% of the budget but only 50% of revenue share, it's overfunded relative to what's actually closing, but check the channel's funnel role first (see Media Mix Analysis) before recommending a cut.
For Tier 3 clients, HubSpot deals frequently can't be traced back to a specific channel: the deal's own source field is often left blank ("OFFLINE") by HubSpot itself, and there's no reliable link from a deal back to the contact that originated it. Real revenue from those deals is still counted in the total Revenue KPI, but excluded from the per-channel table so it doesn't get misattributed. This is normal, not a data error: the note tells you exactly how much and how many deals it affects, worth mentioning to the client proactively rather than waiting for them to ask why the channel totals don't add up to the KPI figure.
When Revenue Isn't Shown
Some clients have HubSpot connected and real contacts flowing in, but have never once tracked a deal to close (or a contact to Customer stage) in their own CRM. Showing "Revenue: $0" in that case would look like the media isn't working, when the real issue is that nobody at the client is updating HubSpot pipeline. ProofIQ detects this (has this client ever closed a deal or reached Customer stage, not just in the selected period) and automatically switches to media performance: Cost Per Lead and Leads per $1K Spend instead of Revenue and ROAS, with a banner explaining why.
Don't lead with "your revenue is zero." Lead with: "We can see the media is generating real leads at $X per lead: what we can't see yet is what happens to them after they enter HubSpot, because deals aren't being tracked to close there." This reframes it as a data-hygiene gap on their side, which it genuinely is, rather than a performance problem on the media side. It's often a useful opening to ask whether their sales team is actually using HubSpot deals, or tracking closes somewhere else entirely.
Media Mix Analysis is built around comparing spend share to revenue share: that reasoning doesn't translate to leads, so it's hidden rather than shown with confusing numbers. Use the channel breakdown table instead: it shows spend, leads, cost per lead, and lead share directly, which is enough to have a real "is this channel working" conversation without needing a revenue signal that doesn't exist yet for this client.
Interpreting ROAS & Cost Per Lead
ROAS in financial services looks dramatically different from e-commerce because deal values are much larger. A blended ROAS of 26x on a Tier 3 client means real closed-won deal amounts, summed from HubSpot, divided by real ad spend; it is not simulated or model-adjusted. The right framing for a client: "Based on your actual closed deals this period and what we spent to generate the leads behind them, the realized return on your media investment was X." Still worth noting this reflects deals that closed in the window, not necessarily deals that were generated in the window; sales cycles mean the two can diverge.
These are the equivalent efficiency metrics for clients in media-performance mode. Cost Per Lead is blended spend divided by leads generated; Leads per $1K Spend is the inverse, scaled, useful for comparing channels directly since a channel with a lower CPL and higher leads-per-$1K is unambiguously more efficient at generating volume, even without a revenue number to tie it to yet.
Media Mix Analysis
Each channel shows two numbers: budget share (percentage of total spend) and credit share (percentage of real revenue this channel generated). The gap between the two is the signal: a channel with 19% budget share but 50% revenue share is generating more per dollar than its budget allocation implies.
The funnel stage badge (Awareness, Consideration, Conversion) provides context: an overfunded Awareness channel may still be critical to pipeline even if it doesn't show revenue directly. The narrative below the channel tiles explains the gap in plain English and accounts for the channel's role; this narrative is generated from the real numbers on screen, not from a model assumption.
The three scenarios (Conservative, Moderate, Aggressive) are starting points for conversation, not directives. Present them as: "The data shows LinkedIn generating more revenue per dollar than its current budget share implies. We recommend testing a modest shift of $X over 90 days and measuring the impact before making a larger change." Since these numbers now come from one real, deterministic source rather than seven models that could disagree, there's no "model agreement" check to do anymore: the number is just the number. That makes it more important, not less, to sanity-check it against what the client's own sales team is seeing before presenting it.
This is worth taking seriously now in a way it wasn't before: single-touch attribution genuinely does credit the one channel HubSpot's data points to, with no assumption about upstream influence from other channels. If Google Ads is where a contact's real source data points, Google Ads gets the credit; there's no W-Shaped-style "but LinkedIn probably helped" adjustment happening behind the scenes. If you believe LinkedIn is doing real upstream work that isn't showing up in the numbers, that's now a genuinely open question worth testing (a 90-day spend shift, watching whether Google's lead volume or close rate changes), not something the attribution model was quietly accounting for already.
Client Conversations
Start with context: "ProofIQ shows us exactly which channel generated each new contact and, where your deals are tracked, which channel generated the revenue that closed." Emphasize that this is real HubSpot data, not a simulation: that's the strongest thing you can say about it, and it's true.
Show the HubSpot Conversion Anchor first. Make sure the contact and deal counts look right to the client; they know their own pipeline better than any tool. If something looks off, acknowledge it and say you'll investigate before drawing conclusions.
"We moved away from simulated multi-touch models to attribution based directly on your real HubSpot data: every lead is credited to the actual channel your CRM recorded, not a statistical estimate. It's a more direct, more defensible number, even though it means there's no longer a dial to turn." Most clients respond well to this once they understand the old models were built on synthetic conversion paths, not real customer journeys.
Use the Export PDF button in the top right of the Attribution tab: it reports for whatever date range is currently selected on screen, so set that first. It's a straight export of what you're already looking at (KPI summary, HubSpot data, channel breakdown), no separate step needed.
Data Enrichment & Audience Builder
The first tab on the Data Enrichment page, client-scoped via the picker at the top. Upload a FINTRX, AdvisorPro, Discovery Data, or Dakota Data export and it matches against that client's real ProofIQ contacts to attach CRD numbers, useful when a client wants to verify how many of their leads are actually registered advisors, or before a compliance-driven audience push.
The confidence score on each match matters: 1.0 is an exact email match, safe to treat as certain. Anything lower matched on name and firm only: worth a quick spot-check on a handful before you cite the number to a client, especially for common names.
FINTRX, Discovery Data, and AdvisorPro have all been run against real vendor files and verified working. Dakota Data hasn't been tested against a real export yet: if you're uploading one for the first time, spot-check the results more carefully than you would for the other three.
The second tab on the Data Enrichment page, same client picker. Two uploads: a client's 5P/ICP document once (replace it anytime; it's reused for every visitor file after), then a visitor pixel export whenever there's a new batch to score. Each visitor is scored individually against that 5P and comes back ranked hot/warm/cold with a rationale, real contact info (verified email(s), company phone), and (this is the part worth leading with in front of a client) a reason, not just a number.
Export as a Word dossier (one page per prospect, best for a shorter curated handoff), an Excel workbook (best for a larger batch), or CSV; "Auto" picks based on how many prospects matched. Set expectations before running a big file: this is a real per-row AI judgment call, not a lookup, so a file of a few thousand rows can genuinely take over an hour. Safe to leave and come back to.
For a client whose ideal customer is a high-net-worth individual rather than a company (e.g. Growth1031), flip the wealth toggle on that client's 5P setup first: off by default, it scores against job title and company; on, it scores against net worth, income, age, homeowner status, and location instead. Only turn it on for clients whose real targeting criteria is wealth-based.
Proposed, not built yet: a filter that would skip a visitor entirely before scoring if it has no usable contact info, or (for wealth-toggle clients) falls below a minimum net-worth bar. It's a plain, deterministic rule, not an AI step, so it adds no cost of its own. Growth1031's own reference file already does this kind of filtering by hand: 2,383 raw records down to 973 qualified ones, a 59% cut. Applied to a large file, that kind of reduction roughly halves both the cost and the wait, since fewer rows ever reach the scoring step. No decision has been made to build this yet; it isn't live, and nothing today is being filtered.
Pick a client and the page checks for that client's 5P/ICP document (the same one Visitor Fit Scoring uses), showing the filename and upload date if one's on file. Use it as-is, or click "Use a different ICP for this build" to either upload a new 5P for the client (saved and reused by Visitor Fit Scoring too) or paste ICP text scoped to just this one build -- that pasted version is never saved anywhere, so it's the right choice for a one-off build that shouldn't touch the client's real saved ICP. Confirm the website URL, hit Generate, and the site itself plus whichever ICP input you chose ground a real per-campaign plan: campaigns, ad groups, keywords, responsive search ads, negatives, sitelinks, and a compliance-notes tab flagging anything worth a client review before launch. This is a genuine per-campaign AI judgment call against that client's actual positioning, not a fixed template with names swapped in.
Set expectations before clicking Generate: a real build takes roughly 3-4 minutes, not seconds. Safe to leave the tab and come back; the job keeps running either way, and reloading the page resumes watching it rather than losing track.
Three downloads once it's done: a Google Ads workbook, a Microsoft Ads workbook, and a LinkedIn workbook. None of these upload directly into their platform yet: they're built for a strategist to review (an Instructions tab explains each other tab, and a Buyer Persona tab summarizes the 5P the plan was built from) before manually building the campaign in-platform. The LinkedIn workbook specifically only gets you partway on import: its Campaign Groups and Campaigns tabs bulk-import fine, but LinkedIn's own bulk tools can't create ads at all, so the Ad Copy tab is hand-entry reference when building each ad in Campaign Manager -- don't tell a client it's a one-click LinkedIn upload.
Keyword volume/CPC in the Keyword Estimates tab comes from Keywords Everywhere; if that account runs out of credit, those specific columns come back blank (the Assumption cells are still editable manually) but nothing else about the build is affected -- worth knowing so a blank volume column doesn't read as a broken build.
Two more downloads appear once the review workbooks are approved: a Google Ads Editor CSV and a Microsoft Bulk Upload CSV, the real import files each platform's own tool ingests directly, not another review document. Only bring these in after the review workbook's campaign structure has actually been signed off -- there's no second review step on these. Microsoft's file needs a campaign daily budget it doesn't otherwise generate, so a conservative placeholder is set automatically; open Bulk Upload and set a real budget before actually launching anything from it.
Don't confuse this with Data Enrichment: it's a separate page, not tied to any client, and nothing it does writes into ProofIQ's data. Pick a mode at the top of the page.
Match two lists takes two arbitrary lists (e.g. a 3rd-party list and an IntentIQ export), finds the overlap by email, then company domain, then name+firm, and exports the matched result pre-formatted for LinkedIn, Meta, Google Ads/YouTube, Spotify, or Vibe ad upload. Useful when a client wants to run paid media specifically at people/companies that show up on two separate lists: validating overlap before spending on a custom audience, rather than uploading both lists blind. If a platform's export comes back under its real minimum row count (LinkedIn 300, Spotify 1,000, Vibe 20,000), a warning shows right there before you download; the file still downloads either way, but the platform itself may reject an upload that small.
CRD enrichment flips the purpose: instead of finding overlap between two lists, it attaches CRD numbers from a vendor file onto a list you already have (usually an IntentIQ export). Your list is always the target; the reference side can be a fresh upload or a saved list, your call. Useful when a client wants to know how many contacts on their own list are actually registered advisors, without needing those contacts to already be in ProofIQ.
Saved lists are worth using whenever you'll run the same reference file more than once: upload it a single time (a "Manage saved lists" link appears in CRD enrichment mode), then just pick it from the dropdown on every later match instead of re-uploading a large vendor file each time. Refresh a saved list in place when the client sends an updated version, rather than adding a duplicate. A 100K-row list matches in a few minutes, real and load-tested, not a guess: don't promise instant results if a client asks while you're waiting.
Results are purged 48 hours after the job completes, so download what's needed before wrapping up that conversation. A freshly-uploaded reference file is deleted as soon as matching finishes; a saved list stays put for next time.
Red Flags & Data Issues
This should not happen: a genuinely untracked pipeline should trigger the media-performance banner automatically. If you see plain $0 revenue with the normal KPI labels still showing (Revenue / Blended ROAS, not Cost Per Lead), flag it to the technical team rather than presenting it as-is.
Confirm the client was actually running that channel in the selected window (spend syncing correctly doesn't guarantee HubSpot's data is tagging contacts to it correctly). If spend is real and leads are genuinely zero, that's often a real finding worth surfacing rather than a bug: some campaigns generate impressions and clicks without producing attributable HubSpot contacts. If you suspect it's actually a tracking gap (no UTM tagging, no conversion linking set up on that channel), that's worth flagging to the client directly, since it means their own numbers are undercounted, not just ProofIQ's.
That page has been removed: it was a leftover demo view showing fake, hardcoded numbers disconnected from any real client data, and never should have been presented to anyone. If a client references a number from it, it wasn't real; direct them to the Attribution or Pipeline pages instead.
The daily sync runs once a day; numbers can shift meaningfully right after it runs, especially for a client whose HubSpot team just did a bulk pipeline update. If a number looks off, check whether it changed in the last 24 hours before assuming it's broken, then flag to the technical team with the client name, date range, and what looked wrong.