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.
The Performance page's "Spend, leads and cost per lead by channel" table also shows Revenue and either "Deals won" (Tier 3, real closed HubSpot deals) or "Customers" (Tier 1/2, estimated from customers × average deal value) -- the same revenue data and tier logic as the Attribution tab, just surfaced as extra columns on this table instead of a separate section. These columns are omitted entirely when the client's pipeline isn't tracked yet (same "stale pipeline" condition as elsewhere).
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 tool on the Data Enrichment page (sidebar, under "Under Development"), client-scoped via the picker at the top. Visitor scoring is no longer a second tab here -- see Prospect Fit Report below, its own page now. 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.
Set or replace a client's Ideal Customer Profile here: upload a 5P document, or paste ICP text directly if there's no document to upload. Whichever you set becomes that client's saved ICP -- Prospect Fit Report and PPC Builder both read from it, and neither has its own upload/replace control anymore, just a read-only summary and a link back here. The wealth-fields toggle (for HNW/individual-investor clients) also lives here now.
Replacing a client's ICP takes effect immediately everywhere: the next visitor-scoring run or campaign build for that client uses whatever's on file at the time it starts, not what was on file when a strategist first opened the tab.
Its own page now (sidebar, under Data I/O) -- previously a second tab on Data Enrichment, split out since it's a genuinely different workflow with its own client picker. Shows a read-only summary of the client's ICP (set once in the ICP Library, reused for every visitor file), then upload a visitor pixel export whenever there's a new batch to score -- no ICP on file yet blocks scoring, with a link straight to the ICP Library to set one. Each visitor is scored individually against that ICP 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, and the export can now be capped to just the top N prospects instead of the full list. 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.
Net worth, income, age, homeowner status, marital status, home address, and personal phone are always carried through from the visitor export now, whatever the vendor's file actually has for that person -- none of it is stripped. For a client whose ideal customer is a high-net-worth individual rather than a company, flip the wealth toggle in the ICP Library for that client: it shifts Claude's scoring emphasis toward those fields as the primary fit criteria (instead of job title and company) and changes what the on-screen results preview highlights. Only turn it on for clients whose real targeting criteria is wealth-based; for everyone else Claude still weighs firmographic signals first, even though the underlying data is present either way.
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. One real client's own reference file already does this kind of filtering by hand, cutting raw records by roughly 59% before anything is qualified. 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 shows the same ICP that's set in the ICP Library (the one place to set a client's ICP, also used by Prospect Fit Report), so you always see what you're building from before generating. Use it as-is, or click "Paste a different ICP for just this build" for a one-off override that's never saved -- the right choice when a build shouldn't touch the client's real saved ICP. To set or replace what the client's saved ICP actually is, use the ICP Library tab instead. 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.
A "Single Build" / "Batch Build" toggle appears at the top of PPC Builder for any client with an agent roster on file (Revolution FMO today). Batch Build generates one full campaign build per agent in a single click, each one geographically targeted to a radius around that agent's own office (not zip codes: Google has been retiring zip-code-based targeting platform-wide, so office-address-plus-radius is the real mechanism now, in both the review workbooks and the two platform bulk-import CSVs).
Before running a batch, check the Agent roster table: each row is Agent / Website / Address / Radius / Status, and every field is directly editable in place (a Save button per row), or add a brand-new agent by hand with "+ Add new agent" -- no spreadsheet required for a one-off addition. For a bulk update, re-upload a spreadsheet with Agent, Office Website URL, and Office Address columns: this merges (updates existing agents by name, adds new ones) rather than replacing the whole roster, so nobody already on file gets silently dropped for being left out of one particular file. A near-miss name match (e.g. a typo) comes back as a possible duplicate for you to resolve by hand rather than silently creating a second agent for the same person.
Select which agents to include (or "select all"), then Run batch build. Selecting more than 25 agents at once triggers a cost-estimate confirmation before it actually starts -- read it, since a large batch is a real, non-trivial AI spend, not a free re-run. If this client has no shared ICP/5P on file (true for Revolution FMO -- there will never be one shared ICP across 250+ individually-branded agents), each agent's own website is fetched live and used to ground that agent's build instead, at one small extra cost per agent; you don't need to do anything differently for this, it happens automatically.
A batch's progress card shows a live completed/failed/pending count (polls every 8 seconds) and lists any failed agent's error individually with a "Retry failed only" button -- a failure that says "Overloaded" is Anthropic's API being transiently busy, not a real problem; just retry. Five separate downloads become available once at least one agent finishes: a zip of every completed agent's Google Ads workbook, Microsoft Ads workbook, LinkedIn workbook, Google Ads Editor CSV, and Microsoft Bulk CSV -- same file types and same "review workbook first, bulk CSV only after sign-off" rule as a single build, just one zip covering every agent instead of downloading each one individually.
A "Past batches" list above the roster shows every batch run for this client, each with a View button -- use it to get back to a batch's progress or downloads after navigating away or refreshing the page; nothing about a finished batch is ever lost.
A card on Campaign Reporting shows the real search queries that triggered a client's ads, with spend/clicks/impressions/conversions per term -- one level finer than the campaign-level numbers everywhere else on the page. Google Ads and Bing Ads only; no other paid channel exposes a query report at this level. This is the same underlying data the negative-keyword suggestion feature (see Admin & Ops) surfaces candidates from -- a term you spot here with real spend and no conversions is exactly the kind of thing worth asking your connected Claude about.
Open Campaign Reporting and select Revolution FMO -- a toggle appears at the top ("Campaign Performance" / "Wealth Score Assessment") that only shows up for this one client, since the data behind it only exists for their 13 agent sites. Tracks their 3-step lead-gen assessment (start → 50% complete → full completion) per agent, plus a network-wide rollup.
The tracking plugin hasn't gone live on the agent sites yet, so real numbers will show as zero for now -- that's expected, not a bug. Turn on "Demo mode" (top of that view) to preview the dashboard with realistic sample numbers when showing this to the client before real data arrives; it's clearly labeled as demo, never silently substituted for real data. Once the plugin ships, this switches to real numbers on its own, nothing to change here.
GK3-only for now -- Revolution FMO's own client login doesn't see this.
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 any of the ad platforms below. 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. As of Sep 2026, an enriched result can also be exported straight to an ad platform (below the CRD-verified CSV download), not just downloaded as a raw verification file.
Combine lists (added Sep 2026): upload 2 or more CSV/XLSX files at once, name the run so it stays identifiable later, and get back one merged, deduped list. Dedup runs in two passes: exact email first, then a strict fuzzy name+company match for anything left over -- deliberately no company-domain pass here (unlike Match two lists), since collapsing on shared domain would wrongly merge two different real people who happen to work at the same company. That fuzzy pass also skips any company name that shows up more than 15 times within the same upload (a real, fixed issue: large employers like "Citibank N.A." or "Fidelity Investments" appearing hundreds of times in one list used to make the dedup step both very slow and risk merging genuinely different employees) -- those rows still get deduped on exact email, just not fuzzy company match. A "Past combines" list above the upload form keeps recent runs (name, row counts, a View button) reachable for 48 hours, even after starting a new one.
Every export panel across all three modes now offers the same platform list -- CSV, Meta, LinkedIn (contacts and company list), Google Ads/YouTube, Spotify, Vibe, Bing (Microsoft Advertising), and ChatGPT -- plus a "Download all formats" option in the dropdown that fetches and downloads every format in one click instead of one at a time. ChatGPT's format is flagged "(unverified format)" in the dropdown: no downloadable template exists for it, so it's a best-effort plain email/phone CSV -- treat the first real upload there as a test and flag whatever error comes back.
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.
Activation Tools
Client-scoped, sidebar under Activation. Click "Generate" to draft a first pass of calendar items from that client's ICP/5P plus any campaign/strategy briefs attached on the page (upload a file or paste text as a new brief whenever a new campaign is being planned) -- add or edit items by hand either way. Each item has a scheduled (go-live) date, an optional separate internal deliverable date, a status you update as work progresses (Planned/In progress/Published/Skipped), and its own checkpoint checklist for internal milestones (e.g. "Draft to client," "Client approval"), each with its own due date.
The page opens on an actual month calendar by default: items and checkpoints show on their real dates, with a List toggle for a flat view of everything instead. Clicking any item/checkpoint chip on the calendar jumps to and highlights it in the list.
Use "Share" to hand a client (or anyone without a ProofIQ login) a read-only link to the calendar -- no account needed on their end. One active link per client; revoking it from the same button kills it immediately, and a new one can be generated any time after.
Client-scoped, sidebar under Activation, built for the media activation team specifically. Two tabs that do genuinely different jobs, not two views of the same data:
Budget Plan tracks money: a spreadsheet grid, one row per channel, one column per calendar month of the plan, showing both planned $ (set upfront) and actual $ (logged once that month closes), with variance shown per cell and in the totals row on the far right. Build a plan by hand (Create manually), or upload a real budget flowchart/media plan file and let Claude read it: it proposes a structure (sections, channels, monthly amounts, detected budget) that you review and edit in a preview screen before anything saves, since real client files vary in shape (some have sub-sections, some don't; date labels differ file to file) -- nothing about the format is assumed to be standard. A plan switcher at the top keeps every plan ever created for a client reachable, so last year's plan is a record, not something that gets overwritten by this year's.
Map a row to a real Windsor-synced channel (Google Ads, LinkedIn, Bing, Spotify, Vibe, Meta, Simplifi) via the row's Edit action, and its actual spend fills in by itself on every daily sync, no manual entry needed for that row going forward. A row with no real Windsor match (a flat monthly fee, a channel Windsor doesn't carry) stays manual: type the actual into the always-visible field under each month's planned amount, it saves on blur.
UTM Plan tracks tagging: one row per real campaign or creative, with the exact channel, campaign name, creative name, UTM values (source/medium/campaign/content), and a landing page URL. A single Budget Plan row (e.g. "Google Search") commonly has several UTM Plan items under it (different campaigns/creatives all spending against that one budget line) -- click "Generate UTM items" on the Budget Plan tab to create a starting item for every row that doesn't have one yet (safe to click again later, it only fills gaps). Items stay linked to their row: rename the row's channel mapping later and every linked item's channel updates with it, no manual re-entry.
Two ways to confirm real tagging once a campaign is live, instead of typing in what you assume is correct: Pull from GA4 on one item shows real source/medium/campaign/content combinations GA4 has actually recorded for that campaign, ranked by session volume, pick one to fill the fields. Pull all from GA4 does the same across every item at once, but as a review screen, not an instant apply -- items that already have UTM values start unchecked so nothing gets silently overwritten, and anything matching more than one distinct GA4 combination is flagged so you know to double-check it rather than trust an automatic pick.
Click QA on any item for a full-funnel check: is it showing up in the real ad platform, in GA4, in HubSpot, and does the landing page URL itself actually resolve (a real HTTP check, follows redirects). Every run is saved to a history table on that item, so "did this break, and when" is answerable, not just "is it fine right now."
InboxIQ & Guides
Client-scoped, sidebar under Reporting next to Campaign Reporting. Five sub-tabs: Overview (sent/delivered/open/reply/decay KPIs, a deliverability grade computed from bounce rate/open rate/inbox reputation/errors, and a rules-based recommendations panel flagging things like a critical list decay rate or a paused campaign), Campaigns (per-campaign totals, click through to a daily trend for one campaign), Inboxes (warmup reputation and delivery errors by sending domain), Leads (filter by real engagement status: Interested/Opened/Clicked/Replied/Bounced/Unsubscribed), and Insights (how many emailed leads are already HubSpot contacts and what stage they're in, red-flag campaigns, rankings by open rate, best-performing subject lines).
Data comes in on the same daily sync as everything else in ProofIQ; a "Last synced" timestamp at the top shows how current it is. If a client's leads never show engagement status beyond a raw sequence state, or inbox/lead counts read as zero, that's normal until the next sync has run since the account was connected -- give it one sync cycle before treating it as broken.
Sidebar, under a new "Resources" section. A shared PDF library (reference guides, sell sheets), not client-scoped: the same list shows to every agency staff member and every client user, organized by category with a search box. Uploading, editing, replacing the file, and deleting are agency-admin actions; anyone else can browse and download. Handy for anything you'd otherwise be emailing a client or a new hire on request: a one-pager, a methodology doc, a brand guide.
Billing
ProofIQ has a Billing page (sidebar link, every page) for a client to pay for add-on products directly, on top of whatever media spend they already run through GK3: DemandIQ ($1,500/mo), VisitorIQ ($500/mo), and InboxIQ (one of three volume tiers -- 30k/mo at $1,500, 60k/mo at $3,000, or 100k/mo at $5,000, mutually exclusive with each other). ProofIQ itself stays free either way; it's never something billed through this page.
A client subscribes with a card directly, and can manage or cancel from the same page afterward (opens Stripe's own hosted billing portal, not a custom ProofIQ screen) -- no need to loop in an account lead just to change or cancel an add-on once it's set up. Worth mentioning proactively when a client is already discussing adding one of these products: it's genuinely self-serve now, not a manual invoicing conversation.
Admin & Ops Tools (Sep 2026)
Sidebar under Activation, agency-admin only -- clients never see this, since it registers real domains against GK3's own Spaceship account, not the client's. Type a client's main domain and it generates close variants (short prefix/suffix like "get-" or "-hq", and optionally alt TLDs like .io/.co/.net -- off by default, GK3 normally only registers .com) and checks live availability and pricing.
Available domains can be registered right there (confirms with a dialog first, since it's a real charge to GK3's Spaceship account), copied as a plain text list, or exported as a Word doc to send a client a shortlist to approve before registering anything.
A scheduled job that emails a narrative summary plus PDF of Campaign Reporting to the internal GK3 account team for each client with recent data -- never to the client directly. It's the same narrative/PDF the live page and manual export already produce, not a separate write-up, so it never disagrees with what you'd see by pulling the page yourself. Not on a schedule yet as of this writing; check with the technical team on rollout status before assuming it's already landing in inboxes.
A button on the Overview page that logs in as a handful of dedicated test accounts (one per role) and checks that every page loads cleanly and access permissions are actually enforced -- the kind of check that would have caught the sidebar nav bug (see Recent Changes in the Technical Reference) before a client ever saw it. Also runs automatically once a day and emails a report either way. If it reports every role as "skipped," the test accounts haven't been set up yet; that's a one-time setup step, not something to troubleshoot.
ProofIQ's data pipeline has been migrated off the Windsor.ai broker onto direct, native connections to each platform's own API for Google Ads, Bing/Microsoft Ads, LinkedIn Ads, Meta (Facebook/Instagram) Ads, Spotify, Vibe, Simpli.fi, GA4, and HubSpot. All confirmed live against real client accounts. Reddit is the one exception still routed through Windsor (no native Reddit Ads API access yet -- it requires Reddit's own sales/partner allow-listing, not a self-serve developer process like the others). If a client's numbers on a native-migrated channel look wrong, it's a normal data issue to troubleshoot like any other, not a "known migration gap" -- that migration is done.
Each client's HubSpot connection now uses a "Service Key" (Settings > Development > Keys > Service Keys in their portal) instead of a legacy private app -- HubSpot is sunsetting legacy private apps account-wide by Sept 2027 and stopped allowing new ones as of Oct 26, 2026. Some clients also have a second, separate key (named something like "ProofIQ-ContentSync") scoped to just Forms and Content data -- HubSpot has no read-only scope for Forms or its content/CMS APIs, so rather than grant write-capable scopes on the main read-only CRM key, those two scopes live on their own dedicated, honestly-named key. If a client's HubSpot form submissions aren't showing up in ProofIQ, check with the technical team on whether that client has a ContentSync key set up yet -- not every client has one.
Any GK3 employee can connect their own Claude (claude.ai, Desktop, or Code) to ProofIQ from Settings > Connect Claude, generate a personal access token, and then ask Claude directly about a client's spend, GA4 traffic, HubSpot pipeline, InboxIQ performance, or the same auto-generated insights shown on the dashboard -- without opening ProofIQ itself. It only ever sees what your own ProofIQ login already has access to (the same client-scoping rules apply). Almost everything it can do is read-only; the two exceptions (registering a domain, and pushing an approved negative keyword to a live Google Ads account -- see below) require you to explicitly confirm the exact action in the conversation first, and both are logged.
Ask your connected Claude for negative-keyword suggestions on a client's Google Ads account and it will surface real search terms with meaningful spend/clicks but zero conversions over a lookback window -- candidates worth excluding. Nothing is pushed automatically: Claude will show you the exact term, campaign/ad group, and the numbers behind the suggestion, and only pushes it live (as an exact-match negative) once you explicitly say yes. Every push or rejection is logged. There's no dashboard view for this yet -- it's Claude-conversation-only for now.
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.