RevOps and data hygiene

Read time : 

9
 mins

The Salesforce attribution audit to run before you connect any agent

A Salesforce attribution audit in seven Claude queries: missing first-touch data, campaigns without cost, UTM variants, blank domains, missing Contact Roles.

By

Rob Ientile

•
October 27, 2026
Flowchart: Salesforce records and Heeet attribution pass through seven Claude audit queries.

Last updated: 20 October 2026

Sara is a business analyst and the Salesforce administrator at Nel, the hydrogen company. Before Heeet, a reporting cycle meant exporting thousands of lines, parsing the discrepancies between the ad platforms and Salesforce, and rebuilding the PowerPoint for leadership. Her description of the org's history is the one every admin recognises: "We've had the unfortunate, but common, history of starting over, over and over and over again."

Now connect Claude to an org in one of its starting-over phases. Salesforce in Claude reads records under your permissions and answers in fluent paragraphs. Ask it which campaigns influenced last quarter's pipeline and it answers from whatever Campaign Influence rows exist, without mentioning that Contact Roles are filled in on somewhere between 30 and 50 percent of opportunities in the orgs Heeet audits during onboarding. A dashboard leaves the gap visible. A chat answer fills it with prose.

On 22 September 2026, a marketing manager at a global scientific-instruments manufacturer walked us through his Salesforce org: teams not creating UTM links, campaign members added inconsistently, several tactics routed into a single campaign, and a Flow that had been switched off for four months, which cost 323 opportunities their attribution until Heeet backfilled them. None of that is unusual. All of it is invisible to an agent. This attribution audit is seven queries Claude runs against your own org before you let it answer anyone else's questions.

What do you need to run this play?

RevOps or marketing ops. Once before rollout, then monthly. Thirty minutes the first time.

  • Heeet installed. Queries 1, 4 and 6 read Heeet fields; the others run on standard objects and work in any org.
  • Claude connected to Salesforce, read-only: Salesforce in Claude, or Claude Desktop or Claude Code with the Salesforce Hosted MCP server (sobject-reads). The audit never writes.
  • The free Salesforce audit tool for a first pass, and the UTM campaign builder for the fixes.

What does a clean org look like to an agent?

Every inbound Lead carries a first-touch channel and campaign. Every active paid Campaign carries cost, which the hourly sync handles for connected platforms. Every event Campaign carries cost someone typed in. UTM values come in one spelling each. Target Accounts carry a real web domain, because that's how Heeet matches LinkedIn ad impressions to them. Won Opportunities carry influences, and either Contact Roles are filled in or Heeet's account-level influence is switched on so they don't have to be. And the automations that feed all of it are active.

Each of the queries below tests one of those. The answer to each is a percentage. The percentage is what you tell the agent's users.

Where each person sees it

WhoWhere they workWhat Heeet gives them
RevOps or marketing opsClaude, connected read-only to SalesforceSeven coverage percentages and a ranked fix list
Owners of each fixHeeet settings, Salesforce Flows, required fieldsOne named change each, with the records it affects
Everyone who uses Claude on SalesforceThe agent's instructionsThe coverage figures, so every answer carries its own caveat
LeadershipLine 7 of the weekly digest (Play 7)The gate percentages, moving in public every week

How do you run a Salesforce attribution audit?

Query 1: first-touch coverage on new Leads

For Leads created in the last 90 days, count how many have a blank Heeet
first-touch channel or a blank Heeet_Channel__c. Split by Lead Source and by
the form or page they arrived through. Show the covered percentage overall
and per source. If we run ChatGPT Ads, check those leads land in the Paid AI
channel rather than Direct or Referral.

Expected: form-fill leads near 100%, list imports and event uploads near zero. That split is fine as long as everyone knows it. A blended 60% that nobody has explained is not.

Query 2: campaigns with cost and no members, and the reverse

List active Campaigns with cost above zero and no CampaignMembers added in 90
days. Then list Campaigns with more than 20 members added in 90 days and zero
cost, grouped by Campaign Type.

The second list is almost always events, webinars and content campaigns. Two prospects in our April 2026 demo notes said the same sentence about trade shows: nobody enters the spend. Without it, event ROI is a blank cell. An agent asked about event ROI will fill the blank with prose.

Query 3: UTM variants

From Heeet's first-touch and last-touch fields on Leads created this year,
list the distinct source, medium and campaign values with counts. Group values
that differ only by case, spacing or punctuation (LinkedIn, linkedin,
Linkedin-Ads). Show the ten worst families and how many Leads each affects.

Query 4: won deals with influences but no Contact Roles

For Opportunities closed-won in the last 180 days: how many carry Heeet
influence records but zero Contact Roles? List them with owner and amount.
Then compare the average number of Contacts with Heeet influences per won
Opportunity with the average number of Contact Roles.

A marketing leader at a contact-centre software company told Romain in April that Heeet was the fifth attribution tool he had evaluated in a year and that every one broke on the same thing: salespeople not associating contacts with opportunities. Heeet attaches influence at the account level within the opportunity window, which means this query stops being a blocker. The gap is still worth knowing, because Salesforce's own Campaign Influence reports, and any agent reading them, still depend on those roles.

Query 5: Account domains

For Accounts with an open Opportunity or on our target account list, count
how many have a blank Website, a free-mail or social domain, or a domain
shared with another Account. List the worst 20 by open pipeline.

Heeet matches the companies your LinkedIn campaigns reached to your Accounts by web domain. An Account with a blank or wrong domain never shows ad exposure, however many impressions LinkedIn served it. Your domain field is the ceiling on that match rate, and every play that reads exposure inherits it.

Query 6: automation health

Query FlowDefinitionView for flows whose label contains "Heeet", "Campaign" or
"UTM" and show ApiName, IsActive and LastModifiedDate. Then count
Opportunities created in the last 120 days with no Heeet influence at all, by
month created, so I can see whether a gap lines up with an inactive flow.
Finally, count Marketing Influences older than two days with a blank Linear
revenue field.

The four-month gap in the org we saw on 22 September would have shown up here as a cliff in the monthly counts. The last check covers the four model revenue fields Heeet writes every night since 12 October 2026. Blanks older than two days mean the nightly computation isn't reaching those records.

Query 7: the severity list

Rank every finding from Queries 1 to 6 by Leads or Opportunities affected,
then by fix effort (a Heeet setting, a Salesforce Flow, a process change).
Output a table: finding, records affected, fix, owner, and the Heeet setting
or Salesforce object involved.

Most fixes are settings. Heeet creates Campaigns automatically from the paid platforms and, optionally, from any new UTM value it meets on a first lead, which removes most of Query 2's first list and Query 3's variants at the source. The UTM builder standardises what humans still type. Cost on event Campaigns is a required-field decision. Account domains are a validation rule plus a one-off enrichment pass. Contact Roles are a sales-process decision, or a decision to stop depending on them.

How clean is clean enough to connect an agent?

Five gates. Ninety percent first-touch coverage on form-fill Leads. Cost on every active paid Campaign, and on every event Campaign within 30 days of the event. No UTM family with more than three spellings. A real web domain on 90% of target Accounts. Either Contact Roles on 80% of won Opportunities, or Heeet's account-level influence enabled and stated as the model. Plus zero inactive Heeet automations, which isn't a threshold so much as a light switch.

Below the gates, connect the agent anyway, but through the read-only server, and put the coverage percentages in its instructions so every answer carries its own caveat. An agent that says "campaign influence covers 41% of won deals" is useful. One that doesn't know is dangerous in a fluent way.

Why audit before you connect the agent?

An agent inherits the data quality of the org it reads and adds none of its own. It can't see what nobody wrote, and it won't tell you that it can't. Running the audit first turns an unknown gap into a stated one. That's the difference between Sara's years of starting over and an org where the numbers hold still long enough to be trusted.

How do you make it recurring?

Monthly, and before every new skill or agent rollout. Publish the five gate percentages as line 7 of the weekly digest (Play 7) so the numbers move in public. When a gate has held for three months, retire its query from the monthly run and keep the check in the digest.

Related

FAQ

Isn't this what the sfdc-hygiene-check skill in Salesforce in Claude does?

That skill audits sales hygiene: stale close dates, missing fields, stage mismatches. This audit covers the marketing record the sales skill doesn't read. Run both.

Do I need Heeet to run the audit?

Queries 2, 3 and 5 run on standard objects in any org. Queries 1, 4 and 6 read Heeet's first-touch fields and influence records, and Query 3 is far more useful with them because Heeet stores the UTM values where reporting can reach them.

Can Claude fix the problems it finds?

It could, through the sobject-mutations server. Don't. Keep the audit read-only and make the fixes in Heeet settings, Flows and required fields, where they persist and someone owns them.

What is a good first-touch coverage number?

Near 100% on form-fill leads. Imports and event uploads will sit near zero and should be reported separately rather than blended in.

Why does the Account domain matter for attribution?

Heeet matches LinkedIn's company-level ad impressions to your Accounts by web domain. A blank, misspelled or parent-company domain means those impressions never reach the Account record, so any report or agent reading ad exposure undercounts it.

How often should this run?

Monthly, and before any agent or skill is rolled out to a new team. The gates are the definition of done.

Is your Salesforce org ready for an agent to read it?

Heeet writes first-click data, campaign cost and account-level influence onto the records automatically, so the gaps this audit finds stop reappearing.

Book a demo

Summary

Talk to us

Ready to track prospects from lead to close with Heeet?

Heeet gives marketers and sales professionals at IT & Security firms turn geuss work intro informed decisions that drive revenue while meeting the same secruity technical standards you provide your clients.

Talk to us