← All posts Measurement

56 Paid Clicks, 7 AI Referrals, One Opportunity

Seven weeks of Google Ads on a one-person consultancy: $810.83, 56 clicks at $14.48 each, zero conversions. Over the same period AI assistants sent seven people and one of them became the only real opportunity this site has ever produced. Every number, and why the comparison is not the one I expected.

Between September 2nd and October 22nd, 2026 this site spent $810.83 on Google Ads. That bought 1,365 impressions and 56 clicks, at an average of $14.48 each.

It produced zero conversions. Zero inquiries. Nothing.

Over roughly the same period, AI assistants sent seven people. One of them became the only genuine inbound opportunity this site has ever produced.

I want to be careful about what that does and does not mean, because the obvious reading is too tidy and I do not think it is quite right. But the numbers are worth publishing in full, partly because almost nobody publishes theirs, and partly because the most useful finding was not which channel won. It was how badly I was counting one of them, and that I only found out because I went looking for something else.

What $810.83 actually bought

The campaigns were ordinary: Search only, no Search Partners, no Display, exact and phrase match keywords around custom software, CRM development, system integration and business process automation. Not a scattergun setup. The kind of thing you would build if you had read the documentation and were being careful.

MetricValue
Spend$810.83
Impressions1,365
Clicks56
Click-through rate4.10%
Average cost per click$14.48
Conversions0
Inquiries0

A 4.10% click-through rate is not bad. The ads were written well enough that people clicked them. The problem was entirely about who.

The search terms are the whole story

Google reports the actual queries that triggered your ads, as distinct from the keywords you bought. That report is the single most useful screen in the product and the one I would check first in any underperforming account.

Here is a representative slice of what this money was spent on:

  • crm components diagram — one click, $5.51. Somebody wanted a diagram.
  • qnxt software — one click, $14.88. A healthcare claims platform I have no connection to.
  • appwrite io, actix web, nextjs crm, payload cms, django gui builder — developers researching frameworks.
  • base44 pricing, lovable crm template, softr website, react no code builder — people shopping for a no-code tool to build it themselves.
  • virtusa corp, dxc luxoft, belatrix software, vega it novi sad, creatio boston — people navigating to other firms by name.

None of these people were going to hire anyone. They wanted a diagram, a framework, a tool, or a different company.

Meanwhile the queries that were the right shape showed up and went nowhere:

  • software consultant — 6 impressions, 0 clicks
  • hubspot implementation — 4 impressions, 0 clicks
  • integrations consulting, system integration consultant, software implementation consultant, crm implementation specialist — 1 to 2 impressions each, 0 clicks

Those are buyers. There were almost none of them, and the ad was shown for a fraction of the few that existed.

Why bidding harder would not have fixed it

This is the part I got wrong first, so it is worth being explicit about.

When an account underdelivers, the instinct is to raise the bid. Google helps that instinct along. But the diagnostic that actually answers the question is the impression share split: how much of the available auction you lost to budget versus how much you lost to rank.

Lost to budget means you ran out of money and should spend more. Lost to rank means you were outranked, and that is a quality and relevance problem that more money does not solve.

Across every configuration tried — including a $15 maximum bid at $70 a day — this account lost 64% to 90% of impression share to rank, and frequently 0% to budget. The money was never the constraint.

The reason sat in the Quality Score components, which are worth reading separately rather than as one number:

ComponentResult
Quality Score2–5 out of 10
Ad relevanceAbove average, on every scored keyword
Landing page experienceBelow average, on every scored keyword

Ads matched the keywords well. The landing page did not match what the person who typed those keywords wanted. Which, given the search terms above, is exactly right — the page is for a business owner with a process problem, and the traffic was developers looking for a library.

Low Quality Score raises your cost per click and lowers your position at the same time, which is why the account was simultaneously expensive and invisible. That is not a bidding problem wearing a disguise. It is the auction correctly reporting that the ads were being shown to the wrong people.

The thing I should have checked before spending anything

Late in this, I ran the candidate keyword themes through Google's own Keyword Planner to get search volumes. I should have done that on day one. Two results stopped the strategy I was about to propose:

Local has no volume. custom software development phoenix, software developer phoenix, software development company phoenix and business software consultant all return 10 searches a month for the entire state of Arizona — which is Google's lowest reported bucket, meaning somewhere between one and ten. The live data agreed: those keywords drew zero impressions across three weeks. "Target your local market" is advice that assumes your local market is searching. Mine is not.

The adjacent niche is unaffordable. Terms around preventive maintenance and CMMS software have genuine volume — cmms at 14,800 a month, preventive maintenance software at 1,000 — at top-of-page bids of $25.49 to $155.54. That is a market where venture-funded software companies are buying the same words. At any budget a one-person consultancy would set, you are not on that page.

Twenty minutes with the Keyword Planner before launch would have reframed the entire exercise. The cost of skipping it was not the $810. It was running an experiment whose result was determined before it started.

The channel I was not measuring

While that was happening, something else was. I only found it because I went looking for the origin of an opportunity that had arrived without explanation.

The person who contacted me said they had found the business through Google. That was true, and it was also the last step rather than the first. The server log showed their first visit five days earlier, arriving with utm_source=chatgpt.com on the URL — the tag ChatGPT appends to links inside its answers. The Google search came later, and it was a search for the company name, by someone who already had the name.

What settles it is what the site does not rank for. Across 90 days there were zero organic impressions for any query about maintenance, assets, equipment, QR codes, inventory or tracking — the entire subject area of what they needed. A Google search for the problem could not have surfaced this site, because this site does not appear in those results at all.

So I built the report I should have had already. Over 90 days:

AI crawlerRequestsDistinct pages
Meta2,08686
OpenAI47294
Amazon42799
ByteDance32573
Anthropic265110
Perplexity193149
Common Crawl1717
Google-Extended1515

Roughly 3,800 fetches. Against that, seven human referrals — six from ChatGPT, one from Copilot. Five were single-page bounces. Two were real: one read three pages, one read ten across three different service pages. One of those two became the opportunity.

What the analytics actually showed

The intuition here is that analytics should have caught this on its own. Assistants tag the links they emit, utm_source is exactly the thing analytics is built to read, and so the tooling ought to have been telling me all along. That intuition is half right, and the half that is wrong is worth the detail.

GA4 added an AI Assistant channel to its default channel group in May 2026. It recognizes chatgpt.com as a source, sets the session medium to ai-assistant, and files the session under a channel named for it. It works.

It also caught two of the seven.

ArrivalTag on the URLGA4 sessionServer log
Oct 10, ChatGPTutm_source=chatgpt.comAI AssistantYes
Sep 11, Copilotutm_source=copilot.comUnassignedYes
Five more, ChatGPTutm_source=chatgpt.comNo session recordedYes

All seven arrived tagged the same way: a utm_source naming the assistant, and no utm_medium. That omission is why the Copilot visit landed in Unassigned despite GA4 correctly recording copilot.com as its source — default channel rules key on medium, and there was no medium to key on. The ChatGPT visit that did land in AI Assistant had its medium filled in by Google's own recognition of the source, which evidently did not happen for the others.

Why five produced no GA4 session at all, I cannot tell you from this data, and I would rather say so than invent a mechanism. Five of the seven were single-page visits in the server log, so the mundane explanation is the likely one: the measurement tag did not get a chance to fire, or was blocked. That is the ordinary attrition of client-side analytics, and it is why a server log and an analytics property will always disagree slightly about small numbers.

Search Console cannot show you any of it — it reports Google's own result pages, and a chat answer is not one.

So: the channel exists, it is worth turning on, and at this volume it undercounted by more than half. When the number you are deciding on is seven or two, that gap is the decision.

The setup I would now recommend is all three at once. Use GA4's AI Assistant channel as the headline figure. Add a custom channel group keyed on session source to catch the assistants that arrive without a medium — GA4 applies custom groups retroactively, so you see your own history the moment you create one. And keep reading the raw access log, because it is the only one of the three you can audit line by line.

I had been running paid search against a dashboard for seven weeks. The thing that actually worked did show up in it — twice, once under a channel called Unassigned.

What I am not claiming

This is one account, one niche, one seven-week window, and a sample of seven referrals. It is a case study. It is not evidence about your business, and anyone presenting numbers at this scale as a trend is selling something.

Several honest caveats:

  • Seven referrals is not a channel. It is a signal. If it stays at seven a quarter it will never pay a bill on its own.
  • The ads were not run perfectly. They were run carefully, but delivery was intermittent — only 23 of 51 days had any impressions at all — and a larger, longer test might read differently.
  • Attribution is genuinely hard. I am confident about the assistant referral because the tag is unambiguous and the organic data rules out the alternative. I would not be confident about a case with weaker evidence, and neither should you be.
  • Nothing here says AI search is a replacement. It says one channel was measured and the other was not, and the unmeasured one happened to be where the outcome came from.

What I changed

I did not stop the ads. There is promotional credit on the account and letting it expire unspent teaches nothing. What changed was the targeting: narrower keywords chosen from measured volume rather than intuition, pointed at a page written for that specific query, at a bid ceiling set from the Keyword Planner's own range rather than from hope.

The larger change was on the other side. Being fetched 3,800 times and cited roughly never is a specific, diagnosable condition, and the diagnosis turned out to be structural: the pages a buyer would need were written as positioning rather than as answers. Assistants retrieve a page, split it into chunks, and score each chunk on its own — and a chunk only gets quoted if it answers something without the rest of the page around it. Good prose that builds an argument across six paragraphs is exactly the wrong shape for that, however well written it is.

So the service pages and the commercial posts now carry explicit questions with self-contained answers, and declare what they are about in structured data rather than leaving it to be inferred from the prose. Whether that moves anything is an open question, and I will publish the result either way.

The one number I would ask you to go and find

If you take one thing from this: go and grep your own access log for chatgpt.com.

Then compare it against what GA4 reports for the AI Assistant channel over the same period. If the two numbers match, your setup is honest and you can stop thinking about it. If they do not, you have just learned the size of your own blind spot, which costs about thirty seconds to find out.

Mine was seven in ninety days against two in GA4, and one of the seven mattered more than $810.83 of the channel I was actually watching.

Frequently asked

Does Google Ads work for a small consulting business?

It did not work here, and the numbers are specific: $810.83 over seven weeks bought 1,365 impressions and 56 clicks at an average of $14.48, and produced zero conversions and zero inquiries. The failure was not bidding or budget. The queries that matched were developers researching tools and people navigating to competitors by name, because that is who searches the terms a custom software consultancy would bid on. No bid level fixes an intent mismatch.

How do I track ChatGPT referrals in analytics?

GA4 added an AI Assistant channel to its default channel group in May 2026, and it does work — but verify it against your server log before you trust the number. Assistants tag their outbound links with a utm_source and no utm_medium: ChatGPT sends utm_source=chatgpt.com, Copilot sends utm_source=copilot.com. GA4's default channel rules key on medium, which is why in this property seven identically tagged arrivals over 90 days produced two GA4 sessions — one correctly filed as AI Assistant, one from Copilot filed as Unassigned — while the raw access log caught all seven. The practical setup is all three: use the AI Assistant channel as the headline, add a custom channel group keyed on session source to catch what it misses (GA4 applies custom groups retroactively, so you see your history immediately), and keep reading the access log, because it is the only one of the three you can audit line by line.

How much does a Google Ads click cost for custom software keywords?

In this account the average was $14.48 across 56 clicks, with individual clicks ranging from $4.47 to $14.88. For context on the wider market, Google's own Keyword Planner put top-of-page bids for preventive-maintenance and CMMS terms at $25.49 to $155.54. Terms in this category are expensive because software vendors with venture funding are bidding against you for the same words.

Why is my Google Ads Quality Score low?

Check the three components separately rather than the single number, because they fail for different reasons. In this account ad relevance was Above Average on every scored keyword while landing page experience was Below Average on all of them, with Quality Scores of 2 to 5. That combination means the ads matched the keywords well and the page did not match what the searcher wanted — which is a targeting problem wearing a landing-page costume.

Do AI assistants actually send traffic to small sites?

A little, and it is worth more per visit than the volume suggests. Over 90 days this site was fetched roughly 3,800 times by AI crawlers and received 7 human referrals from assistants. Five bounced on one page. Two read several pages each, and one of those became the only genuine inbound opportunity this site has produced. Seven visits is not a channel yet. It is a signal that the ratio of effort to outcome is nothing like paid search.

Should I stop running Google Ads and do AEO instead?

Not on the strength of one business's data, and that includes this one. This is a single account, a single niche and a seven-week window, which is a case study rather than evidence about your situation. What does generalize is the method: measure which queries you actually matched rather than which ones you targeted, check whether your buyers search at all before assuming they do, and read your server log for assistant referrals and reconcile it against GA4's AI Assistant channel, because at low volumes the two disagree and the log is the one you can audit.